Как вы инструктируете NUnit загружать файл сборки dll.config из определенного каталога?
Если сборка содержит файл app.config, ConfigurationManager
будет загружать ее, пока она находится в том же каталоге, что и проект NUnit, который выполняется через NUnit-Gui. Для иллюстрации рассмотрим следующую структуру папок.
+ TestFolder
testProject.nunit
+ AssemblyAFolder
assemblyA.dll
assemblyA.dll.config
+ AssemblyBFolder
assemblyB.dll
assemblyB.dll.config
Оба AssemblyA
и AssemblyB
реализуют код, который вызывает ConfigurationManager
. Если я запускаю эти тестовые сборки самостоятельно в NUnit-Gui, ConfigurationManager
будет правильно разрешать локальные файлы конфигурации.
Однако, если я загружаю testProject.nunit
в NUnit-Gui (который содержит ссылки как на AssemblyA
, так и на AssemblyB
), ConfigurationManager
ищет файл конфигурации в TestFolder
независимо от того, какая сборка выполняется в данный момент.
Есть ли способ перенаправить NUnit на перезагрузку конфигурации приложения на тот, который присутствует в текущем каталоге сборки?
Вот содержимое testProject.nunit
:
<NUnitProject>
<Settings activeconfig="Debug" />
<Config name="Debug" binpathtype="Auto">
<assembly path="AssemblyAFolder\assemblyA.dll" />
<assembly path="AssemblyBFolder\assemblyB.dll" />
</Config>
</NUnitProject>
Ответы
Ответ 1
Блог NUnit объяснил, почему файлы конфигурации загружаются так, как они делают. В основном они сказали, что NUnit позволяет инфраструктуре обрабатывать конфигурационные файлы и не выполняет никаких действий.
Вы также можете использовать файл testProject.config
, который будет загружен в вашем случае, для ссылки на файлы конфигурации для каждой из сборок. Использование атрибута файла appSettings для добавления ключей.
Последней альтернативой является использование атрибута configSource
для использования раздела в одном из конфигурационных файлов сборок.
Надеюсь, что это поможет.
Ответ 2
Nunit не может найти путь к файлу App.config в нашем проекте. Поэтому нам нужно вручную сообщить Nunit, где файл App.config размещен в нашем проекте (очевидно, в корневой папке).
В моем случае структура проекта выглядит следующим образом
+ProjectWEBApp//web pages
+Modules
+aspx pages
+web.Config
+projectBusinesslogic //business logic .cs files
+Modules
+.cs
+ProjectTestName// a seperate Nunit test cases project
+Modules
+App.Config
ProjectWebApp использует ссылки проектаBusinesslogic, который содержит бизнес-логику.
+ ProjectTestName использует ссылку проектаBusinesslogic для тестирования на бизнес-логику.
Проблемы здесь начинаются, проект тестирования Nunit нуждается в собственном файле app.config. он не будет использовать файл web.config, как в случае projectBusinesslogic, поэтому при запуске Nunit выдается сообщение об ошибке
-Null Исключение ссылки....... объект мгновенно не установлен на...........
решение-
Когда вы запускаете графический интерфейс Nunit
- Project- > Откроется новое всплывающее окно
- Свойства → Общие → Имя файла конфигурации- > добавить имя app.config
- Файл- > сохранить и закрыть всплывающее окно
- ON Nunit Gui-File- > Обновить проект
и это простое решение для вашей проблемы
Ответ 3
Решение configSource
данное MarkLawrence, является тем, что я искал, и работает хорошо. Однако задача при реализации этого решения состоит в том, чтобы сделать загрузку конфигурации сборки при выполнении тестов как из явного проекта NUnit (как в моем случае), так и при запуске устройства тесты для сборки отдельно (без явного проекта). Для этого потребовались следующие изменения в макете файла.
+ TestFolder
testProject.nunit
testProject.config
+ AssemblyAFolder
assemblyA.dll
assemblyA.dll.config
assemblyA.dll.configfragment
+ AssemblyBFolder
assemblyB.dll
assemblyB.dll.config
assemblyB.dll.configfragment
Файлы configfragment
создаются, чтобы содержать конфигурацию сборки, которая была однажды в соответствующих файлах config
. После этого файлы config
изменяются, чтобы содержать только элемент configSource
с относительным путем к соответствующему файлу configfragment
. Обратите внимание, что единственный раз, когда этот подход не работает, когда assemblyA.dll
и assemblyB.dll
оба требуют один и тот же раздел конфигурации, так как конфликт возникает при создании testproject.config
.
После экспериментов с этим подходом я решил использовать генерацию конфигурации сборки во время выполнения и удалить все статические файлы конфигурации. Вот какой код, который демонстрирует, как сгенерировать конфигурацию и сделать ее доступной, независимо от того, как загружается сборка.
void WithConfigurationFile(Action method)
{
// Create the assembly configuration.
string settingsSection = "myConfigSectionName";
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add(
settingsSection,
new ConfigSectionType(/*config element values*/);
config.Save();
try
{
// Invoke the method with the new configuration.
ConfigurationManager.RefreshSection(settingsSection);
method();
}
finally
{
// Revert the assembly configuration.
File.Delete(config.FilePath);
ConfigurationManager.RefreshSection(settingsSection);
}
}
С помощью перегрузки ConfigurationManager.OpenExeConfiguration(), которая не принимает путь, мы загружаем конфигурацию из рабочего каталога хост-приложения, который изменяется в зависимости от того, как вы запускаете тесты NUnit. Кроме того, блок try/finally гарантирует, что ваша конфигурация сборки не будет мешать другим тестам, которые могут или не требуют такой конфигурации.
Наконец, для использования в unit test:
[Test]
void VerifyFunctionality
{
WithConfigurationFile(delegate
{
// implement unit test and assertions here
});
}
Я надеюсь, что это поможет другим, кто, возможно, столкнулся с подобными проблемами!
Ответ 4
Используйте атрибут configfile на уровне Config в вашем .nunit файле:
<Config name="Debug" configfile="myconfigfilenamegoeshere.config />
Ответ 5
На самом деле, если вы используете NUnit и бегун в Visual Studio, вы можете придерживаться своего значения в App.config в тестовом проекте. Затем добавьте эту строку в событие Post-build:
copy/Y "$ (ProjectDir) App.config" "$ (TargetDir) $(TargetFileName).config"
Когда вы получаете доступ к ConfigurationManager в своих тестах, NUnit передаст значения в вашем app.config в .Net в методе инициализации.