Как получить каталог во время выполнения модульного теста


Привет при запуске моего модульного теста я хочу получить каталог, в котором работает мой проект, чтобы получить файл.

скажем, у меня есть тестовый проект под названием MyProject. Тест я запускаю:

AppDomain.CurrentDomain.SetupInformation.ApplicationBase

и я получаю "C:SourceMyProject.TestbinDebug".

это близко к тому, что мне нужно. Я не хочу binDebug часть.

кто-нибудь знает, как вместо этого я мог бы получить "C:SourceMyProject.Test"?

11 52

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));

Я не уверен, что это помогает, Но это, похоже, будет кратко затронуто в следующем вопросе.

переменная среды пути решения Visual Studio

лучшим решением, которое я нашел, было поместить файл в качестве встроенного ресурса в тестовый проект и получить его из моего модульного теста. С этим решением мне не нужно заботиться о путях к файлам.

для Нанит это то, что я делаю:

// 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;

вы можете сделать это так:

using System.IO;

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