在为单元测试创建模拟时,我们是否在自欺欺人?
Do we lie to ourselves when creating a mock for a unit test
从昨天开始,我才刚刚开始学习所有关于单元测试的知识,今天正在阅读有关 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"));
}
好的,所以首先我们制作一个假的 object 来表示实际 class 的接口,我们在其中有一个实际的方法来做一些实际的工作。然后我们调用该方法,但我们也告诉它 return true。
然后我们断言它是否是 returning true ?好吧,我们只是在 return 之前告诉它了一行!现在我们测试它是 returning true!他们我们说好的好过去了吗?
我不明白!对我来说是这样的感觉:老师告诉孩子为了通过考试,如果被问到这个问题,就回答是,然后去问那个问题,孩子说是,考试就通过了?
测试的目的是检查方法可能表现的每一种方式。如果您告诉该方法一个真语句,它 return 是假的。显然你写的方法有问题。有时,最复杂的问题可以通过查找代码中的简单错误来解决。 (在这种情况下,检查该方法在被要求 return true 时是否实际上 return true。)如果它没有这样做。你搞砸了。
根据对这个问题的评论,这个测试很可能展示了模拟库的工作原理。对于我们的测试代码,我们极不可能(部分模拟是一个潜在的例外)模拟出我们想要测试的 class。相反,我们可能想要模拟代码使用的一些东西,以获得更多确定性测试,或更快的测试,或模拟罕见事件的测试等。
对于你的直接问题,是的,我想当我们为测试模拟依赖项时,我们有点在自欺欺人。我们说 "let's pretend that our dependency does X, then check our code does Y"。现在有可能依赖从未真正做到 "X"。对我来说,嘲笑的目的是从这个虚构开始,然后测试我们的依赖性并确保它确实做到了 "X",直到虚构最终与现实相符。
从昨天开始,我才刚刚开始学习所有关于单元测试的知识,今天正在阅读有关 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"));
}
好的,所以首先我们制作一个假的 object 来表示实际 class 的接口,我们在其中有一个实际的方法来做一些实际的工作。然后我们调用该方法,但我们也告诉它 return true。 然后我们断言它是否是 returning true ?好吧,我们只是在 return 之前告诉它了一行!现在我们测试它是 returning true!他们我们说好的好过去了吗? 我不明白!对我来说是这样的感觉:老师告诉孩子为了通过考试,如果被问到这个问题,就回答是,然后去问那个问题,孩子说是,考试就通过了?
测试的目的是检查方法可能表现的每一种方式。如果您告诉该方法一个真语句,它 return 是假的。显然你写的方法有问题。有时,最复杂的问题可以通过查找代码中的简单错误来解决。 (在这种情况下,检查该方法在被要求 return true 时是否实际上 return true。)如果它没有这样做。你搞砸了。
根据对这个问题的评论,这个测试很可能展示了模拟库的工作原理。对于我们的测试代码,我们极不可能(部分模拟是一个潜在的例外)模拟出我们想要测试的 class。相反,我们可能想要模拟代码使用的一些东西,以获得更多确定性测试,或更快的测试,或模拟罕见事件的测试等。
对于你的直接问题,是的,我想当我们为测试模拟依赖项时,我们有点在自欺欺人。我们说 "let's pretend that our dependency does X, then check our code does Y"。现在有可能依赖从未真正做到 "X"。对我来说,嘲笑的目的是从这个虚构开始,然后测试我们的依赖性并确保它确实做到了 "X",直到虚构最终与现实相符。