Проблема с NUnit при определении каталога сборки - PullRequest
29 голосов
/ 02 декабря 2010

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

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

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

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

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

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

Ответы [ 7 ]

49 голосов
/ 15 марта 2015

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

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

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

Есть три способа найти файл, который находится в том же каталог как сборка:

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

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

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

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

19 голосов
/ 02 декабря 2010

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

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

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

13 голосов
/ 02 декабря 2010

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

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

1 голос
/ 04 сентября 2013

Мы включаем тестовый ресурс в тестовый проект (в данном случае в папку «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";
1 голос
/ 02 декабря 2010

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

Установлен ли внешний файл как часть сборки вашей dll?Если вы включите его в проект и установите его всегда копировать в Копировать в вывод в свойствах файла, тогда он должен перейти в теневой каталог, я думаю.

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

0 голосов
/ 15 апреля 2017

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

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

String root_path = "{{your path}}";
AppDomain.CurrentDomain.SetData("APPBASE", root_path);
0 голосов
/ 02 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...