Недавно я столкнулся со странной проблемой при выполнении юнит-тестов.Мое решение содержит вспомогательный класс со свойством для получения каталога исполняемой сборки.Это выглядит следующим образом:
public static class DirectoryHelper
{
public static string ExecutingAssemblyDirectory
{
get
{
var codeBase = Assembly.GetExecutingAssembly().CodeBase;
var uri = new UriBuilder(codeBase);
var path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}
}
Этот метод вызывается из различных тестовых классов для получения относительных путей к файлам к зависимым ресурсам.
В качестве примеров возьмем следующие надуманные проекты:
TestProject1.dll - TestFixture1.cs
[TestFixture]
public class TestFixture1
{
[Test]
public void VerifyExecutingAssemblyDirectory1()
{
StringAssert.Contains(@"\TestProject1\bin\Debug",
DirectoryHelper.ExecutingAssemblyDirectory);
}
}
TestProject2.dll - TestFixture2.cs
[TestFixture]
public class TestFixture2
{
[Test]
public void VerifyExecutingAssemblyDirectory1()
{
StringAssert.Contains(@"TestProject2\bin\Debug",
DirectoryHelper.ExecutingAssemblyDirectory);
}
}
Когда эти тесты запускаются по отдельности, они проходят, и местоположение возвращаемой сборки является папкой отладки класса теста.
Однако при запуске вместеTestFixture2.VerifyExecutingAssemblyDirectory2 () фактически возвращает путь к папке bin TestProject1
, а не TestProject2
.
Я пытаюсь определить, почему происходит такое поведение, и лучше понять, как это происходитоб этом. Я обнаружил, что использование .GetCallingAssembly
решит эту проблему, но не похоже, что мне нужно это делать.
Я создал пример для воспроизведенияэтот вопрос и размещен на GitHub. TylerNielsen / NUnitExecutingAssemblyExample
Примечание. Мне известно о TestContext.TestDirectory
в NUnit, однако в настоящее время эта библиотека не зависит от NUnit, и я бы предпочел сохранить ее таким образом.
ОБНОВЛЕНИЕ Я запускаю тесты NUnit через Resharper в Visual Studio и через консоль NUnit3.Когда я запускаю с помощью NUnit3-Console, я указываю только два отдельных .dll и не предоставляю никаких других аргументов.