Unit testing 如果我的单元测试没有';t测试逻辑,我真的完成了什么实质性的事情吗?

Unit testing 如果我的单元测试没有';t测试逻辑,我真的完成了什么实质性的事情吗?,unit-testing,mocking,nsubstitute,Unit Testing,Mocking,Nsubstitute,我是单元测试新手,我正在使用NSubstitute进行模拟。我读过几篇关于单元测试的高级目的的文章,其中的许多理论都非常令人满意。然而,如果我的测试不是在一个具体的类中测试任何逻辑,我似乎无法理解我的测试是如何值得的 使用NSubstitute文档()中的示例,让我们假设一个基本的计算器接口: public interface ICalculator { int Add(int a, int b); string Mode { get; set;

我是单元测试新手,我正在使用NSubstitute进行模拟。我读过几篇关于单元测试的高级目的的文章,其中的许多理论都非常令人满意。然而,如果我的测试不是在一个具体的类中测试任何逻辑,我似乎无法理解我的测试是如何值得的

使用NSubstitute文档()中的示例,让我们假设一个基本的计算器接口:

    public interface ICalculator
    {
        int Add(int a, int b);
        string Mode { get; set; }
        event EventHandler PoweringUp;
    }
我们将使用NSubstitute替换实例,指定返回,并使用断言进行测试:

    calculator = Substitute.For<ICalculator>();
    calculator.Add(1, 2).Returns(3);
    Assert.That(calculator.Add(1, 2), Is.EqualTo(3));
calculator=Substitute.For();
计算器。加(1,2)。返回(3);
Assert.That(calculator.Add(1,2),Is.EqualTo(3));
因为我们已经指定,当1和2被传递给Add方法时,总是会返回3,这如何帮助我们测试存在于实现ICalculator接口的具体类中的潜在错误逻辑?如果没有,为什么这个测试值得


谢谢

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

模拟通常用于检查协作器类的逻辑。例如,考虑这个(愚蠢)方法,如果两个数字总计达三:

,则采取一些动作。
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));
calculator=Substitute.For();
计算器。加(1,2)。返回(3);
Assert.That(myObject.arytheytree(1,2,calculator)是.EqualTo(true));

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

如果要测试Add方法的具体类,需要:ICalulator icalc=new MyCalc();Assert.AreEqual(3,MyCalc.Add(1,2));我感谢你的帮助!这就是我在代码中所做的。