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\\"
?
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
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.
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
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));
/// <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));
}
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 + @"..\..\";
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");
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;
Je ne suis pas sûr que cela aide, mais cela semble être brièvement abordé dans la question suivante.
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 + "..\\..\\");
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.
Vous pouvez le faire comme ça:
using System.IO;
Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"..\..\"));