Unit testing 如果我的单元测试没有';t测试逻辑,我真的完成了什么实质性的事情吗?
我是单元测试新手,我正在使用NSubstitute进行模拟。我读过几篇关于单元测试的高级目的的文章,其中的许多理论都非常令人满意。然而,如果我的测试不是在一个具体的类中测试任何逻辑,我似乎无法理解我的测试是如何值得的 使用NSubstitute文档()中的示例,让我们假设一个基本的计算器接口: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;
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));我感谢你的帮助!这就是我在代码中所做的。