Проблема с NUnit при определении каталога сборки
Я только начал работать с NUnit, чтобы предоставить некоторые тестовые покрытия для моих проектов.
В моей основной библиотеке .dll мне нужно загрузить данные конфигурации из внешнего файла, который идет с библиотекой, library.xml.
Это отлично работает, когда я использую библиотеку, потому что я использую следующее, чтобы получить каталог для поиска файла конфигурации:
string settingspath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Проблема, которую я заметил, заключается в том, что когда я тестирую модуль с помощью NUnit, он копирует мои сборки в теневое копирование, но не принимает никаких других файлов с ним, поэтому, конечно, мой init не работает из-за отсутствующие файлы конфигурации.
Должен ли я делать что-то другое, чтобы находить файлы конфигурации из моей библиотеки? (это серверное приложение, и я не хочу использовать стандартные параметры приложения или локальные настройки пользователя и т.д.)
Ответы
Ответ 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);