使用nunit测试测试内部函数的工作

时间:2012-02-26 08:48:09

标签: c# testing nunit

我有一个在内部调用许多函数的函数。我在教程中看到测试方法的设计方式只检查外部函数的返回值。如何检查内部函数返回的值。

仅测试GetValues()方法值。如何检查GetValues()内其他方法的工作情况。如何使用单元测试检查其工作情况?

[TestFixture]
    public class Class1
    {
        [Test]
        public void Tester()
        {
            TesterClass clasObj;
            int a = clasObj.GetValues();
            Assert.AreEqual(10,a);
        }
    }

3 个答案:

答案 0 :(得分:1)

我认为你可以使用像TypeMock这样的工具来做到这一点,但是大多数工具都不允许这样做的原因。这是因为它通常会使测试变得非常脆弱,这意味着当您更改类的内部代码时,测试将会中断。内部成员应该被封装,这是一件好事。我会看一下可以通过公共界面测试的设计。

答案 1 :(得分:1)

  

如何使用单元测试检查其工作情况?

在单元测试中,你只关心被测单元。在这种情况下,它是GetValues。此外,通常只对公共方法进行单元测试。因为只有公共方法(接口)必须进行测试而不是内部工作。

它还确保测试不易碎。如果你改变私有/内部方法的工作方式,但基本上会使公共接口工作相同(特别是当你使用模拟时,而不是真的在你正在进行的那种测试中),你不应该真的如此面临失败的单元测试。

在这种情况下,您应确保您的单元测试覆盖所有正在测试的公共方法的代码路径以及被测试方法调用的私有/内部方法。

有时,您确实希望测试内部结构,一种方法是使用InternalsVisibleToAttribute并将测试程序集标记为“朋友”。

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

另一种方法是子类化您正在测试的类(可能在您的测试程序集中),并将一个公共包装器方法添加到要测试的方法中,并使用此代理类和公共包装器进行测试。

答案 2 :(得分:1)

通常,您希望避免测试代码的内部实现,这样您就可以重构并且不会破坏任何测试。但是,如果要测试另一个对象的内部,那么答案很简单。通过想要测试私有实现,代码气味是当前测试的对象做了太多的工作。反过来又违反single responsibility principle等规则。

因此,将GetValues拆分为可以测试的新对象,例如:

ExampleFormatter.FormatValues()

现在这将是一个带有公共方法的公共类,这意味着您可以轻松地对其进行测试。现在所有GetValues必须使用正确的参数调用FormatValues。您可以使用mock object来验证这是否按预期发生。由于这是现在公开的,什么时候可以测试值的格式如我们所期望的等等。任何时候你发现很难测试一些代码,这通常意味着代码做得太多,打破它!