Подтвердить что ты не робот

Проблема с NUnit при определении каталога сборки

Я только начал работать с NUnit, чтобы предоставить некоторые тестовые покрытия для моих проектов.

В моей основной библиотеке .dll мне нужно загрузить данные конфигурации из внешнего файла, который идет с библиотекой, library.xml.

Это отлично работает, когда я использую библиотеку, потому что я использую следующее, чтобы получить каталог для поиска файла конфигурации:

string settingspath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

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

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

4b9b3361

Ответ 1

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

Ответ 2

Использование может использовать TestContext.CurrentContext.TestDirectory как упоминается Чарли Пул из NUnit здесь:

Необходимость доступа к файлам в том же каталоге, что и тестовая сборка, наиболее часто упоминаемая причина отключения теневой копии. Однако, это ложно.

NUnit не копирует любые сборки: теневая копия - это функция .NET. сам. Следовательно, проблему нужно рассматривать как "Как я могу получить доступ к файлу, где он?", а не "Как я могу получить файл скопировали туда, где я думаю, что это должно быть?"

Существует три способа найти файл, который находится в том же как сборка:

1) Используйте Assembly.Codebase - это даст вам местоположение как URI, которые вы должны затем преобразовать в соответствующий путь.

2) Используйте текущий каталог, который исторически установлен в NUnit. каталог, содержащий тестовую сборку. Однако это может не верны для будущих выпусков.

3) Используйте NUnit TestContext.CurrentContext.TestDirectory, который является доступный в самых последних версиях.

Все эти подходы фактически используют Assembly.Codebase под с помощью NUnit, выполняющего работу по правильному преобразованию URI в # 2 и # 3. Общий подход использования Assembly.Location неверен, если вы действительно не хотите, чтобы местоположение теневой копии Кэш.

Ответ 3

Для использования файлов ссылок в моих модульных тестах я использую Assembly.Codebase, который работает, даже если Shadow Copying включен. Вы можете попробовать попробовать.

Он возвращает строку в формате Uri.. поэтому вам нужно создать экземпляр Uri из строки кода и использовать Uri.LocalPath для получения фактического пути к папке.

Однако для производственного кода BaseFolder следует извлекать из известного места (например, ключ реестра, установленный установщиком в Windows). Все поиски файлов должны быть укоренены из этого baseFolder.

Ответ 4

Даже если теневое копирование активно, AppDomain.CurrentDomain.BaseDirectory указывает на исходное местоположение тестовых DLL.

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

Ответ 5

вы можете отключить теневое копирование в командной строке с помощью переключателя /noshadow. Параметры командной строки документированы здесь

Является ли внешний файл установленным частью сборки вашей DLL? Если вы включите его в проект и скопируете его всегда в Copy to Output в свойствах файла, тогда он должен перейти в теневую директорию, я думаю.

Это может вам помочь.

Ответ 6

Мы включаем тестовый ресурс в тестовый проект (в этом случае в папку "TestData" ).

В Visual Studio для доступа к ресурсу в тестовой метке In Visual Studio for the resource to access in the test mark

Когда сборка проекта оставляет изображение в папке "bin\Debug" When project builds leaves the image on the 'bin\Debug' folder

и вы пишете путь

string fullImagePath = @".\TestData\vcredist.bmp";

Ответ 7

Обнаружена та же проблема... следующая моя тренировка:

Перед запуском SUT обновите базовый каталог AppDomain таким образом....

String root_path = "{{your path}}";
AppDomain.CurrentDomain.SetData("APPBASE", root_path);