我有一个静态类,它有一个私有变量 .
private static Dictionary<strng, string> items = new Dictionary<string, string>();
该类的许多公共方法都访问此字典对象 . 现在我想编写NUNit测试类(在不同的库中) . 我该如何测试这个私有变量?
在进行单元测试时,您应该测试公共接口,而不是私有实现 . 在对其执行操作时检查接口是否按预期运行,而不检查字典本身 . 这样,如果您决定将来用不同的数据结构替换Dictionary,您将不会破坏所有测试 .
你不测试私有变量,你测试类的行为 .
这意味着您应该只测试类的公共接口 .
另见this问题 .
我不会讨论天气你应该或不测试内部类的内部方法 . 您可以公开内部方法/属性/类/等 . 通过使用InternalsVisibleToAttribute属性到外部库 .
例如,如果您的单元测试库名为MyUnitTestsLibrary,只需在项目的AssemblyInfo.cs文件中添加以下内容(正在测试的文件) .
[assembly:InternalsVisibleTo("MyUnitTestsLibrary")]
这将使MyUnitTestsLibrary库成为您项目的朋友库,以便对其进行测试并公开所有内部内容,以便进行单元测试 .
我知道问题是关于NUnit的,我不想争论测试私人成员是好还是坏 . 事实是,它有时是必要的,特别是当你必须处理你无法重构的遗留或设计不良的代码时 .
所以我想提一下Gallio/MbUnit提供了一个名为Mirror的轻量级API,以便于使用私有类型成员进行测试 .
示例:以下测试示例在 foo 实例上调用名为 SomePrivateMethod 的私有方法 .
foo
SomePrivateMethod
[Test] public void SampleTest() { var foo = new Foo(); int actual = Mirror.ForObject(foo)["SomePrivateMethod"].Invoke(); Assert.AreEqual(123, actual); }
4 回答
在进行单元测试时,您应该测试公共接口,而不是私有实现 . 在对其执行操作时检查接口是否按预期运行,而不检查字典本身 . 这样,如果您决定将来用不同的数据结构替换Dictionary,您将不会破坏所有测试 .
你不测试私有变量,你测试类的行为 .
这意味着您应该只测试类的公共接口 .
另见this问题 .
我不会讨论天气你应该或不测试内部类的内部方法 . 您可以公开内部方法/属性/类/等 . 通过使用InternalsVisibleToAttribute属性到外部库 .
例如,如果您的单元测试库名为MyUnitTestsLibrary,只需在项目的AssemblyInfo.cs文件中添加以下内容(正在测试的文件) .
这将使MyUnitTestsLibrary库成为您项目的朋友库,以便对其进行测试并公开所有内部内容,以便进行单元测试 .
我知道问题是关于NUnit的,我不想争论测试私人成员是好还是坏 . 事实是,它有时是必要的,特别是当你必须处理你无法重构的遗留或设计不良的代码时 .
所以我想提一下Gallio/MbUnit提供了一个名为Mirror的轻量级API,以便于使用私有类型成员进行测试 .
示例:以下测试示例在
foo
实例上调用名为SomePrivateMethod
的私有方法 .