Модульное тестирование приложения.конфигурационный файл с NUnit
ребята, когда юнит-тестирование приложения, которое опирается на значения из приложения.конфигурационный файл? Как вы проверяете, что эти значения считываются правильно, а как ваша программа реагирует на неправильные значения, введенные в файл config?
было бы смешно изменить файл конфигурации для приложения NUnit, но я не могу прочитать значения из приложения.конфиг я хочу протестировать.
Edit: я думаю, что я должен уточнить, возможно. Я не беспокоюсь об ConfigurationManager не может прочитать значения, но я обеспокоен проверкой того, как моя программа реагирует на значения, прочитанные.
13 ответов:
Я обычно изолирую внешние зависимости, такие как чтение файла конфигурации в своем собственном классе фасада с очень малой функциональностью. В тестах я могу создать макет версии этого класса, который реализует и использует это вместо реального файла конфигурации. Вы можете создать свой собственный макет или использовать для этого рамки, такие как moq или rhino mocks.
таким образом, вы можете легко опробовать свой код с различными значениями конфигурации без написания сложных тестов, которые сначала пишут xml-конфигурацию файлы. Код, который читает конфигурацию, обычно настолько прост, что он требует очень мало тестирования.
вы можете изменить раздел конфигурации во время выполнения в тестовой установке. Например:
// setup System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.Sections.Add("sectionname", new ConfigSectionType()); ConfigSectionType section = (ConfigSectionType)config.GetSection("sectionname"); section.SomeProperty = "value_you_want_to_test_with"; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("sectionname"); // carry out test ...вы, конечно, можете настроить собственные вспомогательные методы, чтобы сделать это более элегантно.
вы можете вызвать метод set ConfigurationManager.AppSettings для установки значений, необходимых для этого конкретного модульного теста.
[SetUp] public void SetUp() { ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue"); // rest of unit test code follows }при запуске модульного теста он будет использовать эти значения для запуска кода
я столкнулся с аналогичными проблемами с web.конфиг.... Я нахожу интересное решение. Вы можете инкапсулировать функцию чтения конфигурации, например, что-то вроде этого:
public class MyClass { public static Func<string, string> GetConfigValue = s => ConfigurationManager.AppSettings[s]; //... }а потом нормально использовать
string connectionString = MyClass.GetConfigValue("myConfigValue");но в модульном тесте инициализировать "переопределить" функцию следующим образом:
MyClass.GetConfigValue = s => s == "myConfigValue" ? "Hi", "string.Empty";подробнее об этом:
http://rogeralsing.com/2009/05/07/the-simplest-form-of-configurable-dependency-injection/
более элегантным решением является использование простой старой инъекции зависимостей от самих параметров конфигурации. IMHO это чище, чем издеваться над классом чтения конфигурации/оберткой и т. д.
например, скажем, класс " погода "требует" ServiceUrl " для того, чтобы функционировать (например, скажем, он вызывает веб-службу, чтобы получить погоду). Вместо того, чтобы иметь некоторую строку кода, которая активно переходит в файл конфигурации, чтобы получить эту настройку (будь то код в классе погоды или отдельный читатель конфигурации, который может быть высмеян в соответствии с некоторыми другими ответами), класс Weather может позволить вводить настройку либо через параметр в конструктор, либо, возможно, через задатчик свойств. Таким образом, модульные тесты чрезвычайно просты и непосредственны, и даже не требуют насмешек.
значение параметра может быть введено с помощью инверсии контейнера управления (или инъекции зависимостей), поэтому потребителям класса погоды не нужно явно укажите значение откуда-то, поскольку оно обрабатывается контейнером.
это сработало для меня:
public static void BasicSetup() { ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(); connectionStringSettings.Name = "testmasterconnection"; connectionStringSettings.ConnectionString = "server=localhost;user=some;database=some;port=3306;"; ConfigurationManager.ConnectionStrings.Clear(); ConfigurationManager.ConnectionStrings.Add(connectionStringSettings); }
вы всегда можете обернуть бит чтения в интерфейсе и иметь конкретную реализацию, считанную из файла конфигурации. Затем вы будете писать тесты с использованием макетных объектов, чтобы увидеть, как программа обрабатывала плохие значения. Лично я бы не стал тестировать эту конкретную реализацию, так как это код .NET Framework (и я предполагаю - надеюсь - MS уже протестировал его).
на самом деле, думая об этом дальше, я полагаю, что я должен сделать, это создать класс ConfigFileReader для использования в моем проекте, а затем подделать его в жгуте модульного теста?
Это обычная вещь, чтобы сделать?
самый простой вариант-обернуть методы, которые читают конфигурацию, так что вы можете заменить значения во время тестирования. Создайте интерфейс, который вы используете для чтения конфигурации и имеете реализацию этого интерфейса, передаваемого в качестве параметра конструктора или установленного на объекте как свойство (как и при использовании инъекции зависимостей/инверсии элемента управления). В рабочей среде передайте реализацию, которая действительно считывает данные из конфигурации; в тестовой среде передайте тестовая реализация, которая возвращает известное значение.
Если у вас нет возможности рефакторинга кода для тестируемости, но все еще нужно его протестировать, Typemock Isolator предоставляет возможность фактически издеваться над классами конфигурации .NET framework, поэтому вы можете просто сказать: "в следующий раз, когда я попрошу такое-то значение appSettings, верните это известное значение."
У меня была такая же проблема,
вы можете использовать NUnit-консоль.exe c:\path1\testdll1.dll c:\path2\testdll2.dll
Это прекрасно работает, даже если обе библиотеки DLL указывают на разные приложения.конфигурации ex testdll1.файл DLL.config и testdll2.файл DLL.конфигурации
Если вы хотите использовать конфигурацию проекта Nunit и обернуть эти две DLL, то у вас не может быть двух конфигураций
вы должны иметь project1.конфигурация, если ваш проект Nunit является project1.нанит в том же месте как проект 1.нанит сидит.
надеюсь, что это помогает
Ну, у меня просто была такая же проблема... Я хотел протестировать проект BL, на который ссылается веб-сайт . но я хотел проверить только BL. Поэтому в случае предварительной сборки тестового проекта я копирую приложение.Файлы конфигурации в папку bin\debug и ссылаться на них из приложения.конфиг...
Comments