我有一个静态类,它有一个私有变量。
private static Dictionary<strng, string> items = new Dictionary<string, string>();
该类的许多公共方法都访问此字典对象。 现在我想编写NUNit测试类(在不同的库中)。我该如何测试这个私有变量?
答案 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)
答案 3 :(得分:3)
进行单元测试时,您应该测试公共接口,而不是私有实现。在对其执行操作时检查接口是否按预期运行,而不检查字典本身。这样,如果您将来决定用不同的数据结构替换Dictionary,那么您将不会破坏所有测试。