Mar*_*age 15 .net configuration unit-testing settings.settings visual-studio
我有一个类库我想用Microsofts单元测试框架进行单元测试.我想测试的一些类是使用应用程序设置配置的.这些设置在Settings.settings具有应用程序范围和合适的默认值的文件中定义.当应用程序使用库时,可以在App.Config文件中覆盖这些设置.如果不是,则使用默认值.这正是我想要它的方式.
在我的一些测试用例中,我想测试设置值的特殊组合,但我不知道如何从单元测试代码更改被测试类所看到的值.这些设置将始终从代码生成的类的属性加载其默认值.
在我的库类中,我访问如下设置:
var mySetting1 = Settings.Default.MySetting1;
var mySetting2 = Settings.Default.MySetting2;
Run Code Online (Sandbox Code Playgroud)
在被测试的类访问设置之前,如何在单元测试中修改这些设置?单元测试可以访问内部设置类并不能解决问题,因为设置具有应用程序范围并且是设置类的只读属性.
Mar*_*age 20
在深入了解ApplicationSettingsBase相关课程后,我想出了解决问题的方法.不是特别漂亮,但它确实完成了工作.
代码生成的设置类是类库项目的内部,它必须可以被单元测试项目访问.将[assembly: InternalsVisibleTo("UnitTestAssemblyName")]属性添加到AssemblyInfo.cs类库项目中.
访问值时,从设置类的属性延迟加载设置.第一步是对设置进行"虚拟"读取以强制执行此延迟加载.在单元测试时,您希望避免在一个测试中更改的设置值影响另一个,因此在延迟加载它们之前必须"重置"设置.这可以使用该Reload()方法完成.此代码放在测试初始化方法中:
Settings.Default.Reload();
var dummy = Settings.Default.MySetting1;
Run Code Online (Sandbox Code Playgroud)
现在存在基础值,可以在每个测试方法中设置.请记住使用正确的类型,因为代码生成的getter将执行强制转换:
Settings.Default.PropertyValues["MyStringSetting1"].PropertyValue = "Foobar";
Settings.Default.PropertyValues["MyDoubleSetting2"].PropertyValue = 3.1416D;
Run Code Online (Sandbox Code Playgroud)
我将围绕Settings类创建一个包装类,然后传递该包装器.然后,您可以轻松地模拟您的设置类.
我能想到的唯一另一件事是稍微更轻巧,更容易模拟选项,使您的设置文件实现一个反映所有设置的界面.调用者并没有太大的不同,但在添加新设置时,您可以减少管道工作.
两者都不是很棒,并且为自动生成的代码执行此操作是一件痛苦的事情,但就我自己想要删除对设置文件的依赖性而言,似乎就是我们所能坚持的.
例如,对于包含字符串应用程序设置和int用户设置的设置文件:
internal sealed partial class Settings : IMySettings {
/*
* here be auto-generate code (and dragons!)
*/
}
internal interface IMySettings
{
string ApplicationSetting
{
get;
}
string UserSetting
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5464 次 |
| 最近记录: |