在单元测试中修改应用程序设置

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)


Dav*_*wns 5

我将围绕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)