如何在NUNit中测试私有变量?

时间:2010-12-20 09:47:52

标签: unit-testing nunit

我有一个静态类,它有一个私有变量。

private static Dictionary<strng, string> items = new Dictionary<string, string>();

该类的许多公共方法都访问此字典对象。 现在我想编写NUNit测试类(在不同的库中)。我该如何测试这个私有变量?

4 个答案:

答案 0 :(得分:8)

我不会讨论天气你应该或不测试内部课程的内部方法。您可以公开内部方法/属性/类/等。使用InternalsVisibleToAttribute属性访问外部库。

例如,如果您的单元测试库名为 MyUnitTestsLibrary ,只需在项目的AssemblyInfo.cs文件中添加以下内容(正在测试的文件)。

[assembly:InternalsVisibleTo("MyUnitTestsLibrary")]

这将使 MyUnitTestsLibrary 库成为项目的朋友库,并对其进行内部测试,以便进行单元测试。

答案 1 :(得分:5)

我知道问题是关于NUnit的,我不想争论测试私人成员是好还是坏。事实是,它有时是必要的,特别是当你必须处理你无法重构的遗留或设计不良的代码时。

所以我想提一下Gallio/MbUnit提供了一个名为Mirror的轻量级API,以便于使用私有类型成员进行测试。


示例:以下测试示例调用SomePrivateMethod实例上名为foo的私有方法。

[Test]
public void SampleTest()
{
   var foo = new Foo();
   int actual = Mirror.ForObject(foo)["SomePrivateMethod"].Invoke();
   Assert.AreEqual(123, actual);
}

答案 2 :(得分:3)

您不测试私有变量,而是测试类的行为。

这意味着您应该只测试类的公共接口。

另见this问题。

答案 3 :(得分:3)

进行单元测试时,您应该测试公共接口,而不是私有实现。在对其执行操作时检查接口是否按预期运行,而不检查字典本身。这样,如果您将来决定用不同的数据结构替换Dictionary,那么您将不会破坏所有测试。