Может ли проект unit test загрузить файл приложения app.config целевого приложения?

Я тестирую приложение .NET(.exe), которое использует файл app.config для загрузки свойств конфигурации. Само приложение unit test не имеет файла app.config.

Когда я пытаюсь использовать unit test метод, который использует любые свойства конфигурации, они возвращают null. Я предполагаю, что это связано с тем, что приложение unit test не загружается в целевое приложение app.config.

Есть ли способ переопределить это или мне нужно написать script, чтобы скопировать содержимое целевого app.config в локальный app.config?

Этот пост-вопрос задает этот вопрос, но автор действительно смотрит на него под другим углом, чем я.

EDIT: Я должен упомянуть, что я использую VS08 Team System для своих модульных тестов.

Ответ 1

Самый простой способ сделать это - добавить файл .config в раздел развертывания на unit test.

Чтобы сделать это, откройте файл .testrunconfig из своих элементов решения. В разделе "Развертывание" добавьте выходные файлы .config из каталога создания проекта (предположительно bin\Debug).

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

Изменить: я забыл добавить, что это не сработает во всех ситуациях, поэтому вам может потребоваться включить запуск script, который переименовывает вывод .config в соответствии с именем unit test.

Ответ 2

В Visual Studio 2008 я добавил файл app.config в тестовый проект как существующий элемент и выбранную копию как ссылку, чтобы убедиться, что он не дублируется. Таким образом, у меня есть только один экземпляр в моем решении. С несколькими тестовыми проектами это очень удобно!

Добавить существующий элемент

Добавить как ссылку

Ответ 3

Если вы используете Team System Test или NUnit, лучше всего создать отдельную библиотеку классов для своих тестов. Простое добавление App.config к вашему тестовому проекту автоматически будет скопировано в вашу папку bin при компиляции.

Если ваш код зависит от конкретных тестов конфигурации, самый первый тест, который я бы написал, подтверждает, что файл конфигурации доступен (чтобы я знал, что я не сумасшедший)

<configuration>
   <appSettings>
       <add key="TestValue" value="true" />
   </appSettings>
</configuration>

И тест:

[TestFixture]
public class GeneralFixture
{
     [Test]
     public void VerifyAppDomainHasConfigurationSettings()
     {
          string value = ConfigurationManager.AppSettings["TestValue"];
          Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found.");
     }
}

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

public class MyObject
{
     public void Configure(MyConfigurationObject config)
     {
          _enabled = config.Enabled;
     }

     public string Foo()
     {
         if (_enabled)
         {
             return "foo!";
         }
         return String.Empty;
     }

     private bool _enabled;
}

[TestFixture]
public class MyObjectTestFixture
{
     [Test]
     public void CanInitializeWithProperConfig()
     {
         MyConfigurationObject config = new MyConfigurationObject();
         config.Enabled = true;

         MyObject myObj = new MyObject();
         myObj.Configure(config);

         Assert.AreEqual("foo!", myObj.Foo());
     }
}

Ответ 4

Если у вас есть решение, которое содержит, например, веб-приложение и тестовый проект, вы, вероятно, хотите, чтобы в тестовом проекте использовался веб-приложение web.config.

Один из способов решить эту проблему - скопировать web.config для тестирования проекта и переименовать его как app.config.

Другим и лучшим решением является изменение цепочки создания и создание автоматической копии файла web.config для проверки выходных данных проектов. Для этого щелкните правой кнопкой мыши Test Application и выберите свойства. Теперь вы должны увидеть свойства проекта. Нажмите "Сборка событий", а затем нажмите кнопку "Редактировать пост-сборку...". Напишите следующую строку:

copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"

И нажмите OK. (Обратите внимание, что вам, скорее всего, нужно будет изменить WebApplication1 в качестве имени проекта, которое вы хотите проверить). Если у вас неправильный путь к web.config, копирование завершится неудачно, и вы заметите его во время неудачной сборки.

Edit:

Копировать из текущего проекта в тестовый проект:

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"

Ответ 5

Это немного устарело, но я нашел лучшее решение для этого. Я пробовал выбранный ответ здесь, но выглядит как .testrunconfig уже устарел.

1. Для модульных тестов Wrap config представляет собой интерфейс (IConfig)

для модульных тестов, config действительно не должен быть частью того, что ваше тестирование позволяет создать макет, который вы можете ввести. В этом примере я использовал Moq.

Mock<IConfig> _configMock;
_configMock.Setup(config => config.ConfigKey).Returns("ConfigValue");
var SUT = new SUT(_configMock.Object);

2. Для теста интеграции динамически добавьте нужную конфигурацию

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if(config.AppSettings.Settings[configName] != null)
{
    config.AppSettings.Settings.Remove(configName);
}
config.AppSettings.Settings.Add(configName, configValue);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("appSettings");

Ответ 7

Если вы используете NUnit, посмотрите этот пост. В основном вам понадобится ваш app.config в том же каталоге, что и ваш .nunit файл.

Ответ 8

Это очень просто.

  • Щелкните правой кнопкой мыши на тестовом проекте
  • Добавить → Существующий элемент
  • Вы можете видеть небольшую стрелку рядом с кнопкой "Добавить"
  • Выберите файл конфигурации, нажмите "Добавить как ссылку"

Ответ 9

Если вы используете приложение, такое как Asp.net ConnectionString, вам нужно добавить атрибут HostType к вашему методу, иначе они не будут загружаться, даже если у вас есть файл App.Config.

[TestMethod]
[HostType("ASP.NET")] // will load the ConnectionString from the App.Config file
public void Test() {

}

Ответ 10

Я использую NUnit, и в моем каталоге проектов у меня есть копия моего App.Config, что я меняю какую-то конфигурацию (например, я перенаправляюсь в тестовую базу данных...). Вам нужно иметь его в той же директории тестируемого проекта, и все будет в порядке.

Ответ 11

Я не мог получить какие-либо из этих предложений для работы с nUnit 2.5.10, поэтому в итоге я использовал функцию nUnit Project → Edit, чтобы указать файл конфигурации для целевой (поскольку другие сказали, что он должен находиться в одной папке как сам файл .nunit). Положительная сторона этого заключается в том, что я могу дать конфигурационному файлу имя Test.config, которое делает его более ясным, что это такое и почему оно есть)