当你们对一个依赖app.config文件中的值的应用程序进行单元测试时?如何测试这些值是否正确读入以及程序如何对输入到配置文件中的错误值做出反应?
必须修改NUnit应用程序的配置文件是荒谬的,但我无法读取我要测试的app.config的值.
编辑:我想我应该澄清一下.我并不担心ConfigurationManager无法读取值,但我担心测试我的程序如何对读入的值作出反应.
我通常会隔离外部依赖项,例如在自己的Facade类中读取配置文件,但功能很少.在测试中,我可以创建这个类的模拟版本,实现并使用它而不是真正的配置文件.您可以创建自己的模型或使用像moq或rhino模拟这样的框架.
这样,您可以轻松地尝试使用不同配置值的代码,而无需编写首先编写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 ...
您当然可以设置自己的帮助方法来更优雅地执行此操作.
您可以调用ConfigurationManager.AppSettings的set方法来设置该特定单元测试所需的值.
[SetUp] public void SetUp() { ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue"); // rest of unit test code follows }
当单元测试运行时,它将使用这些值来运行代码
您可以app.config
使用ConfigurationManager
该类读取和写入该文件
我在使用web.config时遇到了类似的问题....我找到了一个有趣的解决方案.您可以封装配置读取功能,例如:
public class MyClass { public static FuncGetConfigValue = 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/