Как вы инструктируете 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>

person Steve Guidi    schedule 11.09.2009    source источник
comment
Не точный ответ, но не могли бы вы объединить два файла конфигурации и создать один для всего тестового проекта?   -  person TrueWill    schedule 12.09.2009
comment
К счастью, в моем случае это должно сработать, поскольку я читаю отдельные разделы конфигурации в каждой сборке. Мне любопытно, есть ли лучший или более общий подход.   -  person Steve Guidi    schedule 12.09.2009


Ответы (5)


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

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

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

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

person MarcLawrence    schedule 13.09.2009

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 Reference исключение ....... объект Instant не установлен в ...........

Решение - при запуске графического интерфейса Nunit

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

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

person Mangesh Gulhane    schedule 14.03.2012
comment
Спасибо, шагов 1–4 хватило! - person Flea; 19.09.2015

Элемент configSource решение, данное Марком Лоуренсом, - это то, что я искал, и оно прекрасно работает. Однако проблема при реализации этого решения состоит в том, чтобы загрузить конфигурацию сборки при запуске тестов из явного проекта 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 (), которая не принимает path, мы загружаем конфигурацию из рабочего каталога хост-приложения, который меняется в зависимости от того, как вы запускаете тесты NUnit. Кроме того, блок try / finally гарантирует, что ваша конфигурация сборки не будет мешать другим тестам, которые могут требовать или не требовать такой конфигурации.

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

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

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

person Steve Guidi    schedule 19.09.2009

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


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

person Daniel    schedule 23.03.2010

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

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

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

person Steven Hoff    schedule 30.07.2014