首页 文章

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

提问于
浏览
6

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

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

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

4 回答

  • 3

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

  • 8

    你不测试私有变量,你测试类的行为 .

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

    另见this问题 .

  • 3

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

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

    [assembly:InternalsVisibleTo("MyUnitTestsLibrary")]
    

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

  • 4

    我知道问题是关于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);
    }
    

相关问题