Может ли проект модульного тестирования загрузить приложение целевого приложения.конфигурационный файл?


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

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

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

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

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

11 131

11 ответов:

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

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

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

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

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

Add Existing Item

Add As Link

Если вы используете Тестирование Системы Командой или Нанит рекомендуется создать отдельную библиотеку классов для тестов. просто добавление приложения.конфигурация тестового проекта будет автоматически скопирован в папку 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());
     }
}

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

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

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

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

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

Edit:

для копирования из текущего проекта в тест Проект:

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

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

1. Для модульных тестов оберните конфигурацию-это интерфейс (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");

недавно я написал блог о том, как тестировать настройки AppConfig. Надеюсь, это поможет http://nileshgule.blogspot.com/2010/09/unit-test-application-configuration.html

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

Это очень легко.

  • щелкните правой кнопкой мыши на тестовом проекте
  • добавить - >существующий элемент
  • вы можете увидеть небольшую стрелку рядом с кнопкой Добавить
  • Выберите файл config нажмите на кнопку "Добавить как ссылку"

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

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

}

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

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