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