模拟对象的标准

时间:2011-01-05 15:02:07

标签: c# unit-testing mocking standards isolation-frameworks

在Roy Osherove的书[单元测试] [1]一书中,他解释说单个单元测试应该包含0到1个模拟。他建议如果你的测试没有在模拟上断言,那么根本不要使用模拟。他进一步演示了如何使用隔离框架来生成存根,这些存根与模拟类似。他没有对每次测试创建的存根数量建议限制。

我的问题是:这些建议可以应用于所有隔离框架(或所有流行的C#框架)吗?换句话说,是否有一个只能生成模拟的框架 - 而不是存根?是否有一个隔离框架,不区分模拟和存根?

我很好奇Osherove的建议可以很容易地转换成编码标准。

[1]:http://the系统甚至根本没有进行测试,而是从模拟中返回的数据正在测试中。

7 个答案:

答案 0 :(得分:2)

这直接对应于Osherove的建议,即每次测试只执行一次断言。在他的词典中,stub是一个为被测系统提供虚假输入的类,而mock是一个允许您测试被测系统输出的类(使用假类)。

框架是否使用类似的命名约定取决于其设计者,但标准(如果您同意他的建议)应该是每次测试只执行一个断言,并且断言需要假对象 - 仅每个测试应测试一个假对象。

当然,并非所有人都同意他的建议,所以不是每个人都这样做。

答案 1 :(得分:2)

PhilipCalçado最近写了这篇文章:http://fragmental.tw/2010/12/14/one-mock-per-test-considered-not-awesome/。简而言之,他说,关注测试中存在多少个模拟/存根会使您偏离主要关注点:编写好的规范。

答案 2 :(得分:1)

像Moq这样的框架并没有区分它们。 FakeItEasy更进一步,并称所有虚假物品。

是的,它们可以应用,因为模拟只是更聪明的存根。只要你没有在多个模拟器上断言,将stub调用为mock就没那么重要了。换句话说,该建议更多的是每次测试只断言一件事。明确区分模拟和存根并不重要。

答案 3 :(得分:1)

> can those recommendations 
> [a single unit test should contain between 0 and 1 mocks] 
> be applied to all isolation frameworks ?

我认为:如果你假设这些定义,大部分时间都是

  • Unittest =孤立地测试(否则它不是Unittest)
  • 一个功能的一个单元测试
  • 存根或伪是允许隔离但没有验证功能的对象
  • 模拟是具有额外功能的存根,也允许验证

答案 4 :(得分:0)

我使用Moq进行模拟Get it here

我不确定你对“存根”究竟是什么意思,但我认为它可能像Moles from Microsoft这样很酷。 Here

两者都非常有趣且易于使用。

答案 5 :(得分:0)

这种规则应被视为“训练轮”。显然,包含许多存根和模拟的测试已经失去了情节,但坚持每次测试的一个断言或期望只是限制太多。正如引用的Calçado链接指出的那样,重要的是每次测试都有一个概念,这可能涉及一些断言或期望来说明问题。你应该做的最后一件事是强制执行这样的标准。

还有一件事,我们真的应该在这里谈论“期望”,个人互动,而不是整个模拟对象。在实践中,它们通常是相同的,但它模糊了概念。

答案 6 :(得分:-1)

我在C#中使用Rhino mock进行测试。您可以使用它生成模拟或存根。我建议你看看这个框架:http://www.ayende.com/projects/rhino-mocks.aspx