Получение желаемого/правильного пути сборки при модульном тестировании с помощью NUnit
Я только начал экспериментировать с moq для модульного тестирования моих модулей.
На самом деле класс, для которого я должен написать unit test, использует
Assembly.GetExecutingAssembly().Location
для определения пути.
Но это не работает во время написания модульных тестов, потому что путь исполняющей сборки отличается (путь сборки единицы измерения выполняется)
AppData\\Local\\Temp\\3ylnx32t.ukg\\TestApplication.Test\\assembly\\dl3\\aeb938e6\\f3664631_d982ce01
.
Я попытался отключить теневое копирование.
AppDomainSetup appDomain= new AppDomainSetup{ShadowCopyFiles = "false",};
appDomain.ShadowCopyFiles=false.ToString();
все равно, это не сработает!
Любые предложения приветствуются. Спасибо заранее.
Ответы
Ответ 1
Наконец, я сделал это следующим образом:
Я использовал NUnit Framework и отключил копирование Shadow в NUnit. Создал копию моего файла конфигурации в этом каталоге, где вызывается библиотека тестирования модулей.
Итак, всякий раз, когда мой unit test вызывается (скажем, по пути "A" ), мое приложение не жалуется, что в этом месте нет файла конфигурации, так как я поместил свой файл конфигурации в путь "A".
(ps: причина, по которой я получаю местоположение сборки, - это возможность найти мой файл конфигурации в этом месте)
[Вся идея такова: при теневом копировании путь сборки является динамическим. отключите его, а путь сборки статический]
Ответ 2
Вы можете использовать TestContext.CurrentContext.TestDirectory
как упомянуто Чарли Пулом из NUnit здесь.
Ссылка: fooobar.com/questions/214483/...
Ответ 3
Возможно, это не точный ответ на ваш вопрос, но лично я даже не попытаюсь получить фактическое значение Assembly.GetExecutingAssembly().Location
во время unit test. Я бы создал что-то вроде этого:
public interface IAssemblyHelper
{
string GetLocationOfExecutingAssembly();
}
public class AssemblyHelper : IAssemblyHelper
{
public string GetLocationOfExecutingAssembly()
{
return Assembly.GetExecutingAssembly().Location;
}
}
Во время выполнения я бы ввел AssemblyHelper
в конструктор класса, который требовал его, как IAssemblyHelper
. В модульных тестах я бы высмеял IAssemblyHelper
, настроил его для возврата ожидаемого пути и передал макет в конструктор класса.
Тестирование того, что код работает с фактическим исполняемым контуром местоположения сборки в вашем приложении, должен быть частью приемочного теста.
Ответ 4
Мой коллега предложил следующее решение, которое работает для всех наших случаев использования:
public static string AssemblyDirectory
{
get
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
var uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}