Подтвердить что ты не робот

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

Ответ 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 в методе инициализации.