Как издеваться над ConfigurationManager.Параметр appsettings с Moq
Я застрял в этой точке кода, который я не знаю, как издеваться:
ConfigurationManager.AppSettings["User"];
Я должен издеваться над ConfigurationManager, но я не имею понятия, я использую упаковка.
кто-то может дать мне совет? Спасибо!
7 ответов:
Я считаю, что один стандартный подход к этому-использовать фасад шаблон для обертывания configuration manager, а затем у вас есть что-то слабо связанное, что вы контролируете.
таким образом, вы бы обернуть ConfigurationManager. Что-то вроде:
public class Configuration: IConfiguration { public User { get{ return ConfigurationManager.AppSettings["User"]; } } }(вы можете просто извлечь интерфейс из вашего класса конфигурации, а затем использовать этот интерфейс везде в коде) Тогда вы просто издеваетесь над IConfiguration. Возможно, вы сможете реализовать фасад сам по себе несколько по-разному. Выше я решил просто обернуть отдельные свойства. Вы также получаете дополнительное преимущество, имея строго типизированную информацию для работы с, а не слабо типизированные хэш-массивы.
Я использую AspnetMvc4. Минуту назад я написал
ConfigurationManager.AppSettings["mykey"] = "myvalue";в моем методе испытаний, и он работал отлично.
пояснение: метод тестирования выполняется в контексте с настройками приложения, взятыми из, как правило,
web.configилиmyapp.config.ConfigurationsManagerможет достичь этого приложения-глобальный объект и манипулировать им.если у вас есть тестов выполнение тестов параллельно это не очень хорошая идея.
может быть, это не то, что вам нужно выполнить, но вы думали использовать приложение.конфигурация в вашем тестовом проекте? Таким образом, ConfigurationManager получит значения, которые вы помещаете в приложение.config и вам не нужно ничего глумиться. Это решение хорошо работает для моих нужд, потому что мне никогда не нужно тестировать файл конфигурации "переменная".
вы рассматривали заглушка вместо того, чтобы издеваться? Элемент
AppSettingsсвойствоNameValueCollection:[TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { // Arrange var settings = new NameValueCollection {{"User", "Otuyh"}}; var classUnderTest = new ClassUnderTest(settings); // Act classUnderTest.MethodUnderTest(); // Assert something... } } public class ClassUnderTest { private readonly NameValueCollection _settings; public ClassUnderTest(NameValueCollection settings) { _settings = settings; } public void MethodUnderTest() { // get the User from Settings string user = _settings["User"]; // log Trace.TraceInformation("User = \"{0}\"", user); // do something else... } }преимущества-это более простая реализация и отсутствие зависимости от системы.Конфигурация, пока она вам действительно не понадобится.
Это статическое свойство, и Moq предназначен для методов экземпляра Moq или классов, которые могут быть высмеяны через наследование. Другими словами, Moq не будет никакой помощи вам здесь.
над статикой, я использую инструмент под названием Кротов, который является бесплатным. Есть и другие инструменты изоляции фреймворка, такие как Typemock, которые тоже могут это сделать, хотя я считаю, что это платные инструменты.
когда дело доходит до статики и тестирования, другой вариант-создать статическое состояние себя, хотя это часто может быть проблематичным (как, я думаю, это было бы в вашем случае).
и, наконец, если рамки изоляции не являются опцией, и вы привержены этому подходу, фасад, упомянутый Джошуа, является хорошим подходом или любым подходом в целом, где вы учитываете клиентский код этого от бизнес-логики, которую вы используете для тестирования.
Я думаю, что вы пишете собственное приложение.поставщик конфигурации-это простая задача и более полезна, чем что-либо еще. Особенно вы должны избегать любых подделок, таких как прокладки и т. д. потому что, как только вы используете их редактировать и продолжать больше не работает.
провайдеры, которые я использую, выглядят так:
по умолчанию они получают значения из
App.configно для модульных тестов я могу переопределить все значения и использовать их в каждый тест самостоятельно.нет необходимости в каких-либо интерфейсов или реализуйте его каждый раз снова и снова. У меня есть утилиты dll и использовать этот небольшой помощник во многих проектах и модульных тестов.
public class AppConfigProvider { public AppConfigProvider() { ConnectionStrings = new ConnectionStringsProvider(); AppSettings = new AppSettingsProvider(); } public ConnectionStringsProvider ConnectionStrings { get; private set; } public AppSettingsProvider AppSettings { get; private set; } } public class ConnectionStringsProvider { private readonly Dictionary<string, string> _customValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); public string this[string key] { get { string customValue; if (_customValues.TryGetValue(key, out customValue)) { return customValue; } var connectionStringSettings = ConfigurationManager.ConnectionStrings[key]; return connectionStringSettings == null ? null : connectionStringSettings.ConnectionString; } } public Dictionary<string, string> CustomValues { get { return _customValues; } } } public class AppSettingsProvider { private readonly Dictionary<string, string> _customValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); public string this[string key] { get { string customValue; return _customValues.TryGetValue(key, out customValue) ? customValue : ConfigurationManager.AppSettings[key]; } } public Dictionary<string, string> CustomValues { get { return _customValues; } } }
Comments