Чи може блок тестового проекту завантажувати файл app.config цільової програми?


151

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

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

Чи є спосіб змінити це чи потрібно написати сценарій, щоб скопіювати вміст цільової app.config в локальний app.config?

Цей пост начебто задає це питання, але автор справді дивиться на це з іншого кута, ніж я.

EDIT: Я повинен зазначити, що я використовую командну систему VS08 для моїх тестових одиниць.

Відповіді:


59

Найпростіший спосіб зробити це - додати .configфайл у розділ розгортання на вашому тестовому пристрої.

Для цього відкрийте .testrunconfigфайл із пунктів Рішення. У розділ Розгортання додайте вихідні .configфайли з каталогу збирання проекту (імовірно bin\Debug).

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

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


9
Набагато простіше просто додати тест app.config до тестового проекту - тоді вам зовсім не потрібно грати з .testrunconfig.
Роуленд Шоу

13
@Rowland, якщо ви це зробите, вам потрібно зберегти дві копії app.config. Я вважаю за краще один раз провести 10 секунд, використовуючи інструмент .testrunconfig, ніж потрібно пам'ятати, щоб оновити app.config в обох місцях.
Джеромі Ірвін

66
Ви не можете просто додати посилання, що не копіюється? (Додати існуючий елемент ...)
EFraim

6
Коментар EFraim повинен бути прийнятою відповіддю, це набагато простіше, ніж будь-що інше.
reggaeguitar

28
Для рішення EFraim: Обов'язково використовуйте команду "Додати як посилання" з командної кнопки. Інакше ви все одно отримаєте копію. Крім того, хоча питання спеціально стосується додатка .Net, це не працюватиме для веб-програми, оскільки конфігурація веб-додатка має неправильне ім’я (Web.Config, а не App.Config)
Роб Вон

103

У Visual Studio 2008 я додав app.configфайл до тестового проекту як існуючий елемент і вибрав копію як посилання, щоб переконатися, що він не дублюється. Таким чином, у моєму рішенні є лише одна копія. З кількома тестовими проектами це дуже зручно!

Додати існуючий елемент

Додати як посилання


7
Ідеальна відповідь, проста та об’єктивна! +1
Кастодіо

2
Це найкраще рішення і його слід позначити як відповідь.
niaher

4
Для додавання існуючого елемента "як посилання" слід: "У діалоговому вікні" Додати існуючий елемент "знайдіть і виберіть елемент проекту, який ви хочете пов’язати", а потім: "У спадному списку кнопки Відкрити виберіть Додати як посилання. "
уріель

Це спрацювало для мене чудово. Я намагаюся придумати ситуацію, коли б це не вийшло ... І я вже зараз досить подумав. Дякую!
Dudeman3000

53

Незалежно від того, використовуєте ви тест команди Team або NUnit , найкраща практика - створити окрему бібліотеку класів для своїх тестів. Просто додавши App.config до свого тестового проекту, автоматично під час компіляції буде скопійовано у вашу папку .

Якщо ваш код покладається на конкретні тести на конфігурацію, я б на першому тесті написав би перевірку наявності файлу конфігурації ( щоб я знав, що я не божевільний ):

<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());
     }
}

2
Я погоджуюсь із духом передачі залежності від конфігурації, на це, здається, відповів Марк Семанн не менше! тут: Невдалі тестові одиниці через відсутність .config-файлу
Shaun

У рядку є "відсутність: string value = ConfigurationManager.AppSettings [" TestValue]; Я спробував це виправити, але мені довелося б знайти ще 5 символів, щоб виправити, щоб отримати stackoverflow, який дозволив би мені змінити зміни.
Джейн

22

Якщо у вас є рішення, яке містить, наприклад, веб-додаток та тестовий проект, ви, ймовірно, хочете, щоб тестовий проект використовував web.config веб-програми.

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

Іншим і кращим рішенням є модифікація ланцюга складання і зробити її автоматичною копією web.config для тестування каталогу виводу проектів. Для цього клацніть правою кнопкою миші Тест програми та виберіть властивості. Тепер вам слід побачити властивості проекту. Натисніть кнопку "Побудувати події", а потім натисніть кнопку "Редагувати пост-збірку ...". Напишіть туди наступний рядок:

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

І натисніть кнопку ОК. (Зверніть увагу, що вам, ймовірно, потрібно змінити WebApplication1 під час проекту проекту, який ви хочете перевірити). Якщо у вас неправильний шлях до web.config, копія не вдасться, і ви помітите це під час невдалої збірки.

Редагувати:

Щоб скопіювати з поточного проекту в тестовий проект:

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

Дійсно приємне рішення. Це допомогло мені уникнути копіювання та копіювання .configфайлів. Дякую, що поділились! :)
Леніел Маккаферрі

Дуже приємне рішення! Дуже дякую.
Він Шахдар

Приємне рішення, але що відбувається, коли основні web.configмають лише посилання на зовнішні .configфайли в рамках одного проекту. Оскільки шлях може вказувати лише на папки в одному каталозі (що правда як правило), під час запуску тестів він не зможе обробляти ці зовнішні файли. Будь-яка ідея, як її вирішити?
Sugafree

Це працювало для мене: скопіюйте "$ (SolutionDir) \ MainProject \ Web.config" "$ (ProjectDir) app.config"
Андрій

8

Це трохи старе, але я знайшов для цього краще рішення. Я намагався обрати відповідь тут, але схоже. .Strustrunconfig вже застарілий.

1. Для модульних тестів Wrap конфігурацією є інтерфейс (IConfig)

Для тестів Unit конфігурація дійсно не повинна бути частиною тестування, тому створюйте макет, який можна вводити. У цьому прикладі я використовував 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");

5

Це дуже просто.

  • Клацніть правою кнопкою миші на вашому тестовому проекті
  • Додати -> Існуючий елемент
  • Біля кнопки Додати ви можете побачити маленьку стрілку
  • Виберіть файл конфігурації, натисніть "Додати як посилання"

4

Якщо ви використовуєте NUnit, погляньте на цю публікацію . В основному вам потрібно мати свою app.config у тому ж каталозі, що і ваш .nunit файл.


Я використовую команду VS08 System System для моїх тестових одиниць, але дякую за підказку NUnit!
Йордан Пармер

2

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

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

}

0

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


0

Я не зміг змусити жодних із цих пропозицій працювати з nUnit 2.5.10, тому я в кінцевому підсумку скористався функцією Проект nUnit -> Редагувати, щоб вказати конфігураційний файл для націлювання (так як інші сказали, що він повинен знаходитися в тій же папці, що і. сам файл nunit). Позитивною стороною цього є те, що я можу надати конфігураційному файлу ім'я Test.config, що робить його набагато зрозумілішим, що це таке і чому це таке)


0

Ваші одиничні тести розглядаються як середовище, в якому працює ваш код, щоб перевірити його. Як і будь-яке нормальне середовище, у вас є інсценізація / виробництво. Вам може знадобитися також додати .configфайл для свого тестового проекту. Вирішення проблеми полягає у створенні бібліотеки класів та перетворенні її в Test Project, додавши необхідні пакети NuGet, такі як NUnit та NUnit Adapter. він ідеально працює як з Visual Studio Test Runner, так і з Resharper, і ви маєте свій app.configфайл у своєму тестовому проекті. введіть тут опис зображення

введіть тут опис зображення

введіть тут опис зображення

введіть тут опис зображення

І нарешті налагодив мій тест та значення з App.config:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.