web-dev-qa-db-fra.com

Comment obtenir un répertoire lors de l'exécution du test unitaire

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.

Supposons que j'ai un projet test nommé MyProject. Test je lance:

AppDomain.CurrentDomain.SetupInformation.ApplicationBase

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

Ceci est proche de ce que je suis après. Je ne veux pas le bin\\Debug partie.

Quelqu'un sait comment au lieu je pourrais obtenir "C:\\Source\\MyProject.Test\\"?

64
AnonyMouse

Je le ferais différemment.

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

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

Éditer: Copier dans la sortie = Copier si plus récente est la meilleure option

62
Ilian

Généralement, vous récupérez votre répertoire de solution (ou le répertoire de projet, en fonction de la structure de votre solution) comme suit:

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

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

34
Darien Pardinas
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 alook à ce lien

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

23
manu_dilip_shah

Suite au commentaire de @ abhilash.

Cela fonctionne dans mes fichiers EXE et DLL et lorsque testé à partir d'un projet UnitTest différent dans les modes Debug ou Release:

var dirName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location.Replace("bin\\Debug", string.Empty));
7
Jeremy Thompson
/// <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));
}
6
user1207577

Je le fais normalement comme ça, puis j'ajoute simplement "..\..\" sur le chemin pour accéder au répertoire que je veux.

Voici ce que vous pourriez faire:

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

Pour NUnit, voici ce que je fais:

// Get the executing directory of the tests 
string 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 à partir de là revenir à d’autres répertoires si nécessaire:

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

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, i.e: C:\...\MyAssembly.dll
var location = Assembly.GetExecutingAssembly().Location;

Si vous utilisez NUnit, alors:

// return the absolute path of directory, i.e. C:\...\
var testDirectory = TestContext.CurrentContext.TestDirectory;
1
houss

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

1
David Z.

Mon approche consiste à obtenir l'emplacement de l'ensemble de test unitaire, puis à le déplacer vers le haut. Dans l'extrait suivant, la variable folderProjectLevel vous donnera le chemin d'accès au projet de test unitaire.

string pathAssembly = System.Reflection.Assembly.GetExecutingAssembly().Location;
string folderAssembly = System.IO.Path.GetDirectoryName(pathAssembly);
if (folderAssembly.EndsWith("\\") == false) {
    folderAssembly = folderAssembly + "\\";
}
string folderProjectLevel = System.IO.Path.GetFullPath(folderAssembly + "..\\..\\");
1
Sau001

La meilleure solution que j'ai trouvée consistait à placer le fichier en tant que ressource incorporée dans le projet de test et à le récupérer à partir de mon test unitaire. Avec cette solution, je n’ai plus besoin de me soucier des chemins de fichiers.

1

Vous pouvez le faire comme ça:

using System.IO;

Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"..\..\"));
0
Ogglas