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

Lea*_*ner 6 nunit unit-testing

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

private static Dictionary<strng, string> items = new Dictionary<string, string>();
Run Code Online (Sandbox Code Playgroud)

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

Mil*_*bir 8

我不会讨论天气你应该或不测试内部类的内部方法.您可以公开内部方法/属性/类/等.通过使用InternalsVisibleToAttribute属性到外部库.

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

[assembly:InternalsVisibleTo("MyUnitTestsLibrary")]
Run Code Online (Sandbox Code Playgroud)

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


Yan*_*vin 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);
}
Run Code Online (Sandbox Code Playgroud)

  • MSTest通过其Accessor事物提供相同的功能。但是对单元测试仍然没有意义,因为您应该针对单元而不是其内部实现进行测试。 (2认同)
  • +1为脚踏实地的观点,而不是传教 (2认同)