Получение желаемого/правильного пути сборки при модульном тестировании с помощью 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: причина, по которой я получаю местоположение сборки, - это возможность найти мой файл конфигурации в этом месте)

[Вся идея такова: при теневом копировании путь сборки является динамическим. отключите его, а путь сборки статический]

Ответ 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);
    }
}