Может ли модульный тестовый проект загрузить файл app.config целевого приложения? - PullRequest
139 голосов
/ 05 декабря 2008

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

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

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

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

РЕДАКТИРОВАТЬ: Я должен упомянуть, что я использую VS08 Team System для своих модульных тестов.

Ответы [ 10 ]

88 голосов
/ 07 октября 2009

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

Add Existing Item

Add As Link

55 голосов
/ 05 декабря 2008

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

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

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

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

53 голосов
/ 05 декабря 2008

Независимо от того, используете ли вы 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());
     }
}
19 голосов
/ 10 ноября 2012

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

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

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

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

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

Edit:

Для копирования из текущего проекта в тестовый проект:

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"
7 голосов
/ 11 марта 2016

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

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

для юнит-тестов, конфигурация действительно не должна быть частью того, что вы тестируете, поэтому создайте макет, который вы можете внедрить В этом примере я использовал 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");
4 голосов
/ 05 декабря 2008

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

3 голосов
/ 24 ноября 2015

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

  • Щелкните правой кнопкой мыши по вашему тестовому проекту
  • Добавить -> Существующий элемент
  • Вы можете увидеть маленькую стрелку рядом с кнопкой Добавить
  • Выберите файл конфигурации, нажмите «Добавить как ссылку»
2 голосов
/ 30 июля 2013

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

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

}
0 голосов
/ 29 октября 2012

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

0 голосов
/ 05 декабря 2008

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

...