94 votes

Comment obtenir le Répertoire lors de l'exécution du test d'unité

Bonjour lors de l'exécution de mon test unitaire, je souhaite obtenir le répertoire dans lequel mon projet s'exécute pour récupérer un fichier.

Disons que j'ai un projet de test nommé MyProject. Test I run :

AppDomain.CurrentDomain.SetupInformation.ApplicationBase

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

C'est proche de ce que je cherche. Je ne veux pas la partie bin\\Debug.

Tout le monde sait comment au lieu de cela je pourrais obtenir "C:\\Source\\MyProject.Test\\" ?

81voto

Ilian Pinzon Points 2125

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 en sortie = Copier toujours.

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

Édition : Copier vers Sortie = Copier si plus récent est la meilleure option

52voto

Darien Pardinas Points 146

Habituellement, vous récupérez votre répertoire de solution (ou répertoire de projet, selon la structure de votre solution) comme ceci :

string solution_dir = Path.GetDirectoryName( Path.GetDirectoryName(
    TestContext.CurrentContext.TestDirectory ) );

Cela vous donnera le répertoire parent du dossier "TestResults" créé en testant des projets.

36voto

newbie Points 148
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;

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

en tant que

AppDomain.CurrentDomain.SetupInformation.ApplicationBase 

ne donne rien d'autre que

Directory.GetCurrentDirectory().

Jetez un œil à ce lien

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

11voto

Jeremy Thompson Points 14428

Suite au commentaire de @ abhilash.

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

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

9voto

user1207577 Points 21
/// <summary>
/// Testing various directory sources in a Unit Test project
/// </summary>
/// <remarks>
/// 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
/// </remarks>
[TestMethod]
public void UT_PathsExist()
{
    // Gets bin\Release or bin\Debug depending on mode
    string baseA = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
    Console.WriteLine(string.Format("Dir A:{0}", baseA));
    Assert.IsTrue(System.IO.Directory.Exists(baseA));

    // Gets bin\Release or bin\Debug depending on mode
    string baseB = AppDomain.CurrentDomain.BaseDirectory;
    Console.WriteLine(string.Format("Dir B:{0}", baseB));
    Assert.IsTrue(System.IO.Directory.Exists(baseB));

    // Returns empty string (or exception if you use .ToString()
    string baseC = (string)AppDomain.CurrentDomain.GetData("DataDirectory");
    Console.WriteLine(string.Format("Dir C:{0}", baseC));
    Assert.IsFalse(System.IO.Directory.Exists(baseC));


    // Move up two levels
    string baseD = System.IO.Directory.GetParent(baseA).Parent.FullName;
    Console.WriteLine(string.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(string.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(string.Format("Dir D/App_Data:{0}", appPathD));
    // C:/solution/UnitTestProject/App_Data
    Assert.IsTrue(System.IO.Directory.Exists(appPathD));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X