我有一个对象引用了一堆Properties.Settings.Default...
值,我需要在该对象的单元测试中存根这些值。
不幸的是,设置对象的类型被声明为internal
,因此我无法从单元测试项目中访问它。
如何存根这些属性的返回值?我正在使用 Rhino Mocks 进行模拟。
我有一个对象引用了一堆Properties.Settings.Default...
值,我需要在该对象的单元测试中存根这些值。
不幸的是,设置对象的类型被声明为internal
,因此我无法从单元测试项目中访问它。
如何存根这些属性的返回值?我正在使用 Rhino Mocks 进行模拟。
一般来说,我不会。与其实际读取 Properties.Settings.Default 的“内部”对象,不如让它们声明一个 cconfigurable 属性(在构造时或通过属性),并让另一段代码填充它们。
这样,您可以在单元测试中测试除默认读取内容之外的所有内容,并且您对读取默认值的方式的耦合度降低,从而更容易在将来切换机制。
还有另一个提示,您可能会发现对解决内部问题很有用,您实际上可以有选择地使您的内部代码对您的单元测试可见。在您正在测试的代码中,打开您的 AssemblyInfo.cs 并添加如下内容:
#if UNITTEST
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("YourUnitTestAssembly")]
#endif
然后,您只需要在构建中定义的 UNITTEST 符号,您的测试程序集就可以查看所有内部成员。
我知道这是一个老问题,但我想我会在我的解决方案中添加它,因为它很简单并且可以帮助某人。
创建的设置类是一个部分类,我们可以利用它来创建我们自己的 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 公开。我们无法将设置文件更改为公开,因为下次我们更改或添加值时它只会被覆盖。