1

我是单元测试的新手,我正在使用 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 接口的具体类中的潜在错误逻辑?如果没有,为什么这个测试值得呢?

谢谢!

4

2 回答 2

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));
于 2014-08-25T06:09:30.530 回答
1

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

于 2014-08-25T12:18:04.463 回答