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

时间:2010-09-15 15:20:12

标签: .net visual-studio unit-testing configuration settings.settings

我有一个类库,我想使用Microsofts单元测试框架进行单元测试。我想测试的一些类是使用应用程序设置配置的。这些设置在具有应用程序范围和适当默认值的Settings.settings文件中定义。当应用程序使用库时,可以在App.Config文件中覆盖这些设置。如果不是,则使用默认值。这正是我想要的。

在我的一些测试用例中,我想测试设置值的特殊组合,但我不知道如何从单元测试代码更改被测试类所看到的值。这些设置将始终从代码生成类的属性加载其默认值。

在我的库类中,我访问如下设置:

var mySetting1 = Settings.Default.MySetting1;
var mySetting2 = Settings.Default.MySetting2;

在被测试的类访问设置之前,如何在单元测试中修改这些设置?单元测试可以访问内部设置类并不能解决问题,因为设置具有应用程序范围并且是设置类的只读属性。

2 个答案:

答案 0 :(得分:16)

在深入了解ApplicationSettingsBase及相关课程后,我想出了解决问题的方法。不是特别漂亮,但它肯定能完成工作。

代码生成的设置类是类库项目的内部,它必须可以被单元测试项目访问。将[assembly: InternalsVisibleTo("UnitTestAssemblyName")]属性添加到类库项目中的AssemblyInfo.cs

访问值时,从设置类的属性延迟加载设置。第一步是对设置进行“虚拟”读取以强制执行此延迟加载。在单元测试时,您希望避免在一个测试中更改的设置值影响另一个,因此在延迟加载它们之前必须“重置”设置。这可以使用Reload()方法完成。此代码放在测试初始化​​方法中:

Settings.Default.Reload();
var dummy = Settings.Default.MySetting1;

现在存在基础值,可以在每个测试方法中设置。请记住使用正确的类型,因为代码生成的getter将执行转换:

Settings.Default.PropertyValues["MyStringSetting1"].PropertyValue = "Foobar";
Settings.Default.PropertyValues["MyDoubleSetting2"].PropertyValue = 3.1416D;

答案 1 :(得分:5)

我将围绕Settings类创建一个包装类,然后传递该包装器。然后,您可以轻松地模拟您的设置类。

我能想到的唯一另一件事是稍微更轻巧,更容易模拟选项,使您的设置文件实现一个反映所有设置的界面。调用者并没有太大的不同,但在添加新设置时,你可以减少管道工作。

两者都不是很棒,而且必须为自动生成的代码执行此操作是一件痛苦的事情,但就我自己想要删除对设置的依赖性而言,这似乎是我们所能坚持的。文件。

E.g。对于包含字符串应用程序设置和int用户设置的设置文件:

internal sealed partial class Settings : IMySettings {

    /*
     * here be auto-generate code (and dragons!)
     */
}

internal interface IMySettings
{
    string ApplicationSetting
    {
        get;
    }

    string UserSetting
    {
        get;
        set;
    }
}