2016-06-14 44 views
1

从昨天开始,我已经开始学习所有关于单元测试的知识,今天的内容特别是关于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")); 

} 

行,所以我们首先做一个假对象来表示,我们在这一个实际的方法,做一些实际的工作实际类的接口。然后我们调用该方法,但我们也告诉它返回true。 然后我们断言它是否返回true?那么我们刚刚告诉它一行之前,返回true!现在我们测试它返回真实!他们我们说好通过? 我不明白!对我来说是这样的:老师告诉孩子为了通过考试答案是如果问这个问题,然后去问问题和孩子说是和考试通过?

+1

您不应该模拟或存根您想要测试的类。只有它的依赖。 –

+0

@YacoubMassad这是在Roy的单元测试书中,所以他只是用这个愚蠢的手段教我们语法? – Bohn

+0

这是书中的一个例子吗?原样? –

回答

2

根据对这个问题的评论,这个测试很可能展示了模拟库的工作原理。对于我们的测试代码,我们极不可能(部分模拟是一个潜在的例外)来嘲笑我们想要测试的类。相反,我们可能想要模拟代码使用的一些东西,以获得更确定的测试,更快的测试或模拟罕见事件的测试等。

对于您的直接问题,是的,我想我们是排序说谎当我们嘲笑测试的依赖关系时我们自己。我们说“让我们假装我们的依赖项是X,然后检查我们的代码是否是Y”。现在有可能这个依赖从来没有真正做过“X”。对我来说,嘲笑的目的是从这个小说开始,然后测试我们的依赖,并确保它确实做了“X”,直到小说最终符合现实。

1

测试的目的是检查一种方法可能表现的每一种方式。如果你告诉该方法一个真实的陈述,并且它返回false。显然你写的方法有问题。有时,最复杂的问题可以通过在你的代码中找到简单的错误来解决。 (在这种情况下,当被要求返回true时,检查该方法是否实际返回true)。如果它没有这样做。你搞砸了。

+0

它是如何测试acutal方法的?它说fakeRules.IsValidLogFileName ...和上面的行告诉它总是返回true! – Bohn

+1

在OP发布的特定情况下,它仅仅是被测试的模拟框架 - 我一次又一次地看到新的测试人员或开发人员在他们不明白背后的想法时被要求编写单元测试的模式他们是。 – stuartd