Как получить каталог во время выполнения модульного теста
Привет при запуске моего модульного теста я хочу получить каталог, в котором работает мой проект, чтобы получить файл.
скажем, у меня есть тестовый проект под названием MyProject. Тест я запускаю:
AppDomain.CurrentDomain.SetupInformation.ApplicationBase
и я получаю "C:SourceMyProject.TestbinDebug"
.
это близко к тому, что мне нужно. Я не хочу binDebug
часть.
кто-нибудь знает, как вместо этого я мог бы получить "C:SourceMyProject.Test"
?
11 ответов:
Я бы сделал это по-другому.
Я предлагаю сделать этот файл частью решения / проекта. Затем щелкните правой кнопкой мыши - > Свойства - > копировать в Вывод = копировать всегда.
этот файл будет скопирован в любой выходной каталог (например C:\Source\MyProject.Тест\бин\ "отладка").
обычно вы получаете каталог решения (или каталог проекта, в зависимости от структуры вашего решения) следующим образом:
string solution_dir = Path.GetDirectoryName(Path.GetDirectoryName(TestContext.TestDir));
это даст вам родительский каталог папки "TestResults", созданной тестовыми проектами.
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
Это даст вам каталог, который вам нужен....
как
AppDomain.CurrentDomain.SetupInformation.ApplicationBase
не дает ничего, кроме
Directory.GetCurrentDirectory().
пристально взглянуть на эту ссылку
http://msdn.microsoft.com/en-us/library/system.appdomain.currentdomain.aspx
/// <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)); }
Я обычно делаю так, а потом просто добавить
"..\..\"
к пути, чтобы добраться до каталога, который я хочу.Так что вы могли бы сделать это:
var path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"..\..\";
далее к комментарию @abhilash.
это работает в моем EXE, DLL и при тестировании из другого UnitTest проекта в обоих режимах отладки или выпуска:
var dirName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location.Replace("bin\Debug", string.Empty));
лучшим решением, которое я нашел, было поместить файл в качестве встроенного ресурса в тестовый проект и получить его из моего модульного теста. С этим решением мне не нужно заботиться о путях к файлам.
для Нанит это то, что я делаю:
// 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;
при необходимости вы можете оттуда перейти обратно в другие каталоги, если требуется:
dir = Path.Combine(dir, "MySubDir");
В общем случае вы можете использовать это, независимо от того, выполняется ли тестовое или консольное приложение или веб-приложение:
// 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;
Если вы используете NUnit, то:
// return the absolute path of directory, i.e. C:\...\ var testDirectory = TestContext.CurrentContext.TestDirectory;