Comment obtenir un répertoire pendant l’exécution du test unitaire

Salut lors de l’exécution de mon test unitaire Je veux obtenir le répertoire dans lequel mon projet est exécuté pour récupérer un fichier.

Disons que j’ai un projet de test nommé MyProject. Test je cours:

AppDomain.CurrentDomain.SetupInformation.ApplicationBase 

et je reçois "C:\\Source\\MyProject.Test\\bin\\Debug" .

C’est proche de ce que je suis après. Je ne veux pas la partie bin\\Debug .

Quelqu’un sait-il comment je pourrais obtenir "C:\\Source\\MyProject.Test\\" ?

Je le ferais différemment

Je suggère de faire de ce fichier une partie de la solution / du projet. Cliquez ensuite avec le bouton droit de la souris sur -> Propriétés -> Copier vers la sortie = Copier toujours.

Ce fichier sera ensuite copié dans n’importe quel répertoire de sortie (par exemple C: \ Source \ MyProject.Test \ bin \ Debug).

En général, vous récupérez le répertoire de votre solution (ou le répertoire du projet, selon la structure de votre solution) comme ceci:

 ssortingng solution_dir = Path.GetDirectoryName(Path.GetDirectoryName(TestContext.TestDir)); 

Cela vous donnera le répertoire parent du dossier “TestResults” créé par les projets de test.

 Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName; 

Cela vous donnera le répertoire dont vous avez besoin ….

comme

 AppDomain.CurrentDomain.SetupInformation.ApplicationBase 

ne donne rien mais

 Directory.GetCurrentDirectory(). 

Avoir regardé ce lien

http://msdn.microsoft.com/en-us/library/system.appdomain.currentdomain.aspx

 ///  /// Testing various directory sources in a Unit Test project ///  ///  /// I want to mimic the web app's App_Data folder in a Unit Test project: /// A) Using Copy to Output Directory on each data file /// D) Without having to set Copy to Output Directory on each data file ///  [TestMethod] public void UT_PathsExist() { // Gets bin\Release or bin\Debug depending on mode ssortingng baseA = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; Console.WriteLine(ssortingng.Format("Dir A:{0}", baseA)); Assert.IsTrue(System.IO.Directory.Exists(baseA)); // Gets bin\Release or bin\Debug depending on mode ssortingng baseB = AppDomain.CurrentDomain.BaseDirectory; Console.WriteLine(ssortingng.Format("Dir B:{0}", baseB)); Assert.IsTrue(System.IO.Directory.Exists(baseB)); // Returns empty ssortingng (or exception if you use .ToSsortingng() ssortingng baseC = (ssortingng)AppDomain.CurrentDomain.GetData("DataDirectory"); Console.WriteLine(ssortingng.Format("Dir C:{0}", baseC)); Assert.IsFalse(System.IO.Directory.Exists(baseC)); // Move up two levels ssortingng baseD = System.IO.Directory.GetParent(baseA).Parent.FullName; Console.WriteLine(ssortingng.Format("Dir D:{0}", baseD)); Assert.IsTrue(System.IO.Directory.Exists(baseD)); // You need to set the Copy to Output Directory on each data file var appPathA = System.IO.Path.Combine(baseA, "App_Data"); Console.WriteLine(ssortingng.Format("Dir A/App_Data:{0}", appPathA)); // C:/solution/UnitTestProject/bin/Debug/App_Data Assert.IsTrue(System.IO.Directory.Exists(appPathA)); // You can work with data files in the project directory's App_Data folder (or any other test data folder) var appPathD = System.IO.Path.Combine(baseD, "App_Data"); Console.WriteLine(ssortingng.Format("Dir D/App_Data:{0}", appPathD)); // C:/solution/UnitTestProject/App_Data Assert.IsTrue(System.IO.Directory.Exists(appPathD)); } 

Je le fais normalement comme ça, et puis j’ajoute juste "..\..\" au chemin pour aller au répertoire que je veux.

Donc, ce que vous pourriez faire, c’est ceci:

 var path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"..\..\"; 

Je ne suis pas sûr que cela aide, mais cela semble être brièvement abordé dans la question suivante.

Variable d’environnement Visual Studio Solution Path

La meilleure solution que j’ai trouvée consistait à placer le fichier en tant que ressource intégrée dans le projet de test et à l’obtenir de mon test unitaire. Avec cette solution, je n’ai pas besoin de me soucier des chemins de fichiers.

Pour NUnit c’est ce que je fais:

 // Get the executing directory of the tests ssortingng dir = NUnit.Framework.TestContext.CurrentContext.TestDirectory; // Infer the project directory from there...2 levels up (depending on project type - for asp.net omit the latter Parent for a single level up) dir = System.IO.Directory.GetParent(dir).Parent.FullName; 

Si nécessaire, vous pouvez revenir à d’autres répertoires si nécessaire:

 dir = Path.Combine(dir, "MySubDir"); 

En général, vous pouvez l’utiliser, que vous utilisiez une application de test ou de console ou une application Web:

 // returns the absolute path of assembly, file://C:/.../MyAssembly.dll var codeBase = Assembly.GetExecutingAssembly().CodeBase; // returns the absolute path of assembly, ie: C:\...\MyAssembly.dll var location = Assembly.GetExecutingAssembly().Location; 

Si vous utilisez NUnit, alors:

 // return the absolute path of directory, ie C:\...\ var testDirectory = TestContext.CurrentContext.TestDirectory; 

Suite au commentaire de @abhilash.

Cela fonctionne dans mes fichiers EXE, DLL et lorsqu’il est testé à partir d’un projet UnitTest différent dans les modes Debug ou Release:

 var dirName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location.Replace("bin\\Debug", ssortingng.Empty)); 

Vous pouvez le faire comme ceci:

 using System.IO; Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"..\..\"));