6

我有一个对象引用了一堆Properties.Settings.Default...值,我需要在该对象的单元测试中存根这些值。

不幸的是,设置对象的类型被声明为internal,因此我无法从单元测试项目中访问它。

如何存根这些属性的返回值?我正在使用 Rhino Mocks 进行模拟。

4

3 回答 3

7

一般来说,我不会。与其实际读取 Properties.Settings.Default 的“内部”对象,不如让它们声明一个 cconfigurable 属性(在构造时或通过属性),并让另一段代码填充它们。

这样,您可以在单元测试中测试除默认读取内容之外的所有内容,并且您对读取默认值的方式的耦合度降低,从而更容易在将来切换机制。

于 2009-12-11T03:44:40.043 回答
4

还有另一个提示,您可能会发现对解决内部问题很有用,您实际上可以有选择地使您的内部代码对您的单元测试可见。在您正在测试的代码中,打开您的 AssemblyInfo.cs 并添加如下内容:

#if UNITTEST
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("YourUnitTestAssembly")]
#endif

然后,您只需要在构建中定义的 UNITTEST 符号,您的测试程序集就可以查看所有内部成员。

于 2009-12-11T04:43:17.450 回答
0

我知道这是一个老问题,但我想我会在我的解决方案中添加它,因为它很简单并且可以帮助某人。

创建的设置类是一个部分类,我们可以利用它来创建我们自己的 Default 实现。

在 Properties 文件夹中创建一个新文件

internal partial class Settings : ISettings
{
    private static ISettings _setInstance;

    internal static ISettings Get
    {
        get
        {
            return _setInstance = _setInstance  ?? Default;
        }
        set { _setInstance = value; }
    }
}

然后,当我们在应用程序的其他地方使用它时,我们可以调用 Settings.Get.。如果要从测试中设置值,请创建一个从 ISettings 继承的类并设置新的实现。

如果在单独的项目中找到您的测试,则必须添加另一个类以将 setter 公开。我们无法将设置文件更改为公开,因为下次我们更改或添加值时它只会被覆盖。

于 2017-03-31T03:14:23.017 回答