如果我的单元测试没有测试逻辑,我真的能完成任何实质性的测试吗?

时间:2014-08-25 03:33:10

标签: unit-testing mocking nsubstitute

我是单位测试的新手,我使用NSubstitute进行嘲弄。我已经阅读了一些关于单元测试的高级目的的文章,并且很多理由非常令人满意。但是,如果不测试具体类中的任何逻辑,我似乎无法理解我的测试是如何值得的。

使用NSubstitute的文档(http://nsubstitute.github.io/help/getting-started/)中的示例,让我们假设一个基本的计算器界面:

    public interface ICalculator
    {
        int Add(int a, int b);
        string Mode { get; set; }
        event EventHandler PoweringUp;
    }

我们将使用NSubstitute替换实例,指定一个返回,并使用Assert进行测试:

    calculator = Substitute.For<ICalculator>();
    calculator.Add(1, 2).Returns(3);
    Assert.That(calculator.Add(1, 2), Is.EqualTo(3));

因为我们已经指定在将1和2传递给Add方法时总会返回3,这有助于我们测试实现ICalculator接口的具体类中存在的潜在错误逻辑?如果它没有,那为什么这个测试值得呢?

谢谢!

2 个答案:

答案 0 :(得分:2)

正如您所指出的,单元测试(主要)意味着测试逻辑。在您给出的示例中,您正在测试模拟对象返回预期的模拟结果 - 因此,除非您自己开发并希望测试它是否成功替换了对象,你是对的,这是毫无意义的。

模拟通常用于检查协作者类的逻辑。例如,考虑这个(愚蠢的)方法,如果两个数字加起来三个就采取一些行动:

public boolean AreTheyThree(int a, int b, ICalculator calc)
{
    return calc.Add(a, b) == 3;
}

现在,如果您想测试这样的方法,那么模拟(替换)您使用的ICalculator是有意义的,因为您不想依赖关于具体的实现细节,或者如果对特定的ICalculator实现引入回归,则对您的逻辑测试失败:

calculator = Substitute.For<ICalculator>();
calculator.Add(1, 2).Returns(3);
Assert.That(myObject.AryTheyThree(1, 2, calculator), Is.EqualTo(true));

答案 1 :(得分:1)

您的测试不值得,因为您没有测试逻辑。此时,您只测试您的测试框架是否正确。为了使您的测试值得,您应该根据计算器测试逻辑。添加并让添加返回3.为您添加功能单独测试。通过将代码隔离到可以单独验证的单元中。如果您根据Add函数测试代码,则不希望该代码失败,因为Add实现不正确。它应该假设您的添加功能是正确的,因为它是单独测试的。