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

Unit testing 如何在NUNit中测试私有变量?,unit-testing,nunit,Unit Testing,Nunit,我有一个静态类,它有一个私有变量 private static Dictionary<strng, string> items = new Dictionary<string, string>(); private static Dictionary items=new Dictionary(); 该类的许多公共方法都访问此dictionary对象。 现在我想编写NUNit测试类(在不同的库中)。如何测试这个私有变量?您不测试私有变量,而是测试类的行为 这意味着您应该

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

private static Dictionary<strng, string> items = new Dictionary<string, string>();
private static Dictionary items=new Dictionary();
该类的许多公共方法都访问此dictionary对象。
现在我想编写NUNit测试类(在不同的库中)。如何测试这个私有变量?

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

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


另请参见问题。

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

我知道问题是关于NUnit的,我不想争论测试私有成员是好是坏。事实上,这有时是必要的,尤其是当您必须处理遗留的或设计糟糕的代码时,您无法重构这些代码

所以我想提到的是,它提供了一个轻量级API,用来简化对私有类型成员的测试


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

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

我不会讨论是否应该测试内部类的内部方法。您可以使用属性将内部方法/属性/类等公开给外部库

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


这将使MyUnitTestsLibrary库成为您要测试的项目的朋友库,并公开其所有内部内容,以便您可以进行单元测试。

MSTest通过其访问器提供相同的功能。但是单元测试仍然是没有意义的,因为您应该针对单元而不是其内部实现进行测试。谢谢您的回答。然而,我发现很多人都支持关于“是否只测试公共接口还是同时测试私有方法”的争论,所以如果我需要测试私有变量,有什么出路吗?是的,你可以通过反射——例如,你可以绕过C#封装。也许Yann的回答可以帮你解决这个问题。不管怎么说,如果我是你,我会寻找另一种方式。否决票:Yann的回答更好,这是没有帮助的和短视的,假设作者的观点是唯一的观点。谢谢你的回答。然而,我发现很多人都支持关于“是否只测试公共接口还是同时测试私有方法”的争论,所以如果我需要测试私有变量,有什么办法吗?如果你真的需要,试试Yann的方法。但其背后的思想是,类与系统其余部分交互的唯一方式是通过其公共接口,所以这就是您需要测试的全部内容。您的类如何选择实现该接口取决于您,只要您通过公共接口履行您的义务。彻底测试,并且对您的实现进行测试是不必要的和脆弱的(很容易因更改而中断)。如果使用签名程序集,这将导致一个痛苦的世界。@eri0o是否要扩展?我很想知道为什么这可能会在今后造成问题
[assembly:InternalsVisibleTo("MyUnitTestsLibrary")]