从昨天开始,我才刚刚开始学习所有关于单元测试的知识,今天正在阅读有关 Mocks 和 NSub
的内容。
我的问题是我不明白它背后的哲学和思维方式。因此,例如阅读我的书是这样的:
[Test]
public void Returns_ByDefault_WorksForHardCodedArgument()
{
IFileNameRules fakeRules = Substitute.For<IFileNameRules>();
fakeRules.IsValidLogFileName(Arg.Any<String>())
.Returns(true);
Assert.IsTrue(fakeRules.IsValidLogFileName("anything.txt"));
}
好的,所以首先我们创建一个假对象来表示实际类的接口(interface),我们在其中有一个实际的方法来做一些实际的工作。然后我们调用该方法,但我们也告诉它返回 true。 然后我们断言它看它是否返回 true ?好吧,我们只是在返回 true 之前告诉它一行!现在我们测试它是否返回真值!他们我们说好的好过去了吗? 我不明白!对我来说是这样的感觉:老师告诉 child 为了通过考试,如果被问到这个问题,就回答是,然后去问那个问题, child 说是,考试就通过了?
最佳答案
根据对这个问题的评论,这个测试很可能展示了 mocking 库是如何工作的。对于我们的测试代码,我们极不可能(部分模拟是一个潜在的异常(exception))模拟出我们想要测试的类。相反,我们可能想要模拟代码使用的一些东西,以便获得更多确定性测试、更快的测试或模拟罕见事件的测试等。
对于您的直接问题,是的,我想当我们为测试模拟依赖项时,我们有点在自欺欺人。我们在说“让我们假装我们的依赖做 X,然后检查我们的代码做 Y”。现在有可能依赖项实际上从未执行过“X”。对我来说, mock 的目的是从这个虚构开始,然后测试我们的依赖性并确保它确实做了“X”,直到虚构最终与现实相符。
关于c# - 在为单元测试创建模拟时,我们是否在自欺欺人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37816799/