Вопрос по directory, c#, unit-testing – Как получить каталог при запуске юнит-теста

58

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

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

<code>AppDomain.CurrentDomain.SetupInformation.ApplicationBase
</code>

и я получаю"C:\\Source\\MyProject.Test\\bin\\Debug".

Это близко к тому, что я после. Я не хочуbin\\Debug часть.

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

Да, я хочу получить файл во время выполнения модульного теста AnonyMouse
Кроме того, вам лучше получить местоположение таким образом.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) abhilash
Так что, если мы правильно вас поняли, у вас есть файл в вашем проекте, и вы хотите получить файл во время выполнения Application / Unit Test? abhilash

Ваш Ответ

12   ответов
5

"..\..\" к пути, чтобы добраться до каталога, который я хочу.

Так что вы могли бы сделать это:

var path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"..\..\";
AppDomain.CurrentDomain.BaseDirectory + @ & quot; \ .. \ .. \ Images \ test.jpg & quot; например у меня работает
Не знаете, как добавить & quot; .. \ .. \ & quot; в AppDomain.CurrentDomain.SetupInformation.ApplicationBase, чтобы перейти в каталог AnonyMouse
Да, извините за это. Я исправил форматирование и добавил пример.
Или вы можете сделать что-то вроде этого: Path.GetFullPath (AppDomain.CurrentDomain.SetupInformation.ApplicationBase + & quot; .. \\ .. \\ .. \\ & quot;)
Это не работает, оно просто добавит & quot; .. \ .. \ & quot; в строку. Вам нужно сделать что-то вроде Path.GetFullPath (Path.Combine (AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @ & quot; .. \ .. \ .. \ & quot ;, & quot; project \\ fille.json & quot;));
0

using System.IO;

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

Я предлагаю сделать этот файл частью решения / проекта. Затем щелкните правой кнопкой мыши - & gt; Свойства - & gt; Копировать на выход = Копировать всегда.

Затем этот файл будет скопирован в любой выходной каталог (например, C: \ Source \ MyProject.Test \ bin \ Debug).

@IlianPinzon Вы не можете назвать любое решение, которое вы не согласны с проблемой XY. ;) Это правильный вопрос, и он заслуживает прямого ответа.
Вопрос о том, как скопировать файл в выходную папку во время сборки, отличается от заданного.
Я также использовал этоCopy To Output Техника, и она работает при запуске модульных тестов индивидуально. Однако он не работает при запуске их из контекста упорядоченного теста. Я получаю ошибку как:System.IO.FileNotFoundException: Could not find file 'C:\SVN\MyProject\TestResults\myName_MACHINE 2017-04-26 12_44_09\Out\MySpreadsheet.xlsx  очевидно, существует другой подкаталог, созданный для хранения результатов теста, и IDK, почему мой исполняемый код будет искать там ...
И НЕ ЗАБЫВАЙТЕ, что вам также нужно установить действие & quot; Build action & quot; НЕТ.
@ RickO 'Shea Первоначальный вопрос былXY problem, Аскер уточнил, что он хотел сделать в своем комментарии: «Да, я хочу получить файл во время выполнения модульного теста». Я просто предоставил решение его реальной проблемы (а не его попытки решения).
1

// 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");
1

поможет ли это, но это будет кратко затронуто в следующем вопросе.

Переменная среды Visual Studio Solution Path

0

вания и последующем движении вверх. В следующем фрагменте переменнойfolderProjectLevel даст вам путь к проекту модульного тестирования.

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 + "..\\..\\");
5

Это работает в моих файлах EXE, DLLand when tested from a different UnitTest project в обоих режимах отладки или выпуска:

var dirName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location.Replace("bin\\Debug", string.Empty));
Это правильно, но простой ответ: Path.GetDirectoryName (Assembly.GetExecutingAssembly (). Местоположение)
1

вы можете использовать это, независимо от того, запускаете ли вы тестовое или консольное приложение или веб-приложение:

// 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;
6
/// <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));
}
+1 заAssert.IsTrue(System.IO.Directory.Exists(directory)); идея. Я адаптировал это и использовалAssert.That(System.IO.Directory.Exists(directory), Is.True);, То же самое, но более читабельно
34

в зависимости от структуры вашего решения) следующим образом:

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

Это даст вам родительский каталог & quot; TestResults & quot; папка, созданная в результате тестирования проектов.

Что такоеTestContext.TestDir ?
Ответ 2016: Path.GetDirectoryName (Path.GetDirectoryName (TestContext.CurrentContext.TestDirectory))
TestDir помечен как устаревший (2016), подумайте об использовании TestContext.TestRunDirectory.
как получить TestContext? Свойство не статично ...
Вы можете добавить общедоступный TestContext TestContext {get; задавать; } в ваш тестовый класс (имя важно), testcontext будет вставлен в свойство перед выполнением теста
22
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;

как

AppDomain.CurrentDomain.SetupInformation.ApplicationBase 

ничего не дает, кроме

Directory.GetCurrentDirectory().

Посмотрите на эту ссылку

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

спасибо это работает в моих модульных тестах
1

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

Похожие вопросы