我是单位测试的新手,我使用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接口的具体类中存在的潜在错误逻辑?如果它没有,那为什么这个测试值得呢?
谢谢!
答案 0 :(得分:2)
正如您所指出的,单元测试(主要)意味着测试逻辑。在您给出的示例中,您正在测试模拟对象返回预期的模拟结果 - 因此,除非您自己开发nsubstitute并希望测试它是否成功替换了对象,你是对的,这是毫无意义的。
模拟通常用于检查协作者类的逻辑。例如,考虑这个(愚蠢的)方法,如果两个数字加起来三个就采取一些行动:
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实现不正确。它应该假设您的添加功能是正确的,因为它是单独测试的。