Как вы указываете NUnit загружать файл dll.config сборки из определенного каталога? - PullRequest
13 голосов
/ 11 сентября 2009

Если сборка содержит файл 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>

Ответы [ 5 ]

5 голосов
/ 14 марта 2012

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 использует ссылки на projectBusinesslogic, которое содержит бизнес-логику. + ProjectTestName использует ссылку projectBusinesslogic для проверки бизнес-логики. Проблемы начинаются здесь, тестовому проекту Nunit нужен собственный файл app.config. он не будет использовать файл web.config, как в случае projectBusinesslogic, поэтому при запуске Nunit будет выдано сообщение об ошибке

-Null Ссылка исключение ....... момент объекта не установлен в ...........

решение- Когда вы запускаете графический интерфейс Nunit

  1. Проект-> Редактировать откроется новое всплывающее окно
  2. Свойства -> Общие-> Имя файла конфигурации-> добавьте app.config Имя файла
  3. Файл-> сохранить и закрыть всплывающее окно
  4. ON Nunit Gui-File-> Обновить проект

и это простое решение вашей проблемы

3 голосов
/ 19 сентября 2009

Решение configSource element , данное MarkLawrence , - это то, что я искал, и прекрасно работает. Однако задача реализации этого решения состоит в том, чтобы загрузить конфигурацию сборки при выполнении тестов как из явного проекта NUnit (как в my case ), так и при выполнении модульных тестов для сборки в отдельности (нет явный проект). Для этого потребовались следующие изменения в моем макете файла.

+ 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 гарантирует, что конфигурация вашей сборки не будет мешать другим тестам, которые могут требовать или не требовать такой конфигурации.

Наконец, для использования в модульном тесте:

[Test]
void VerifyFunctionality
{
    WithConfigurationFile(delegate
    {
        // implement unit test and assertions here
    });
}

Надеюсь, это поможет другим, кто мог столкнуться с подобными проблемами!

2 голосов
/ 23 марта 2010

Используйте атрибут configfile на уровне конфигурации в вашем файле .nunit:


<Config name="Debug" configfile="myconfigfilenamegoeshere.config />

2 голосов
/ 13 сентября 2009

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

Вы также можете использовать файл testProject.config, который будет загружен в вашем случае, для ссылки на файлы конфигурации для каждой из сборок. Использование атрибута файла appSettings для добавления ключей.

Последний вариант - использование атрибута элемента configSource для использования раздела в одном из файлов конфигурации сборок.

Надеюсь, это поможет.

0 голосов
/ 30 июля 2014

На самом деле, если вы используете NUnit и бегун в Visual Studio, вы можете вставить свое значение в файл App.config в своем тестовом проекте. Затем добавьте эту строку в ваше событие после сборки:

copy / Y «$ (ProjectDir) App.config» «$ (TargetDir) $ (TargetFileName) .config»

Когда вы получаете доступ к ConfigurationManager в своих тестах, NUnit передает значения из вашего app.config в .Net в методе initialize.

...