在Roy Osherove的书[单元测试] [1]一书中,他解释说单个单元测试应该包含0到1个模拟。他建议如果你的测试没有在模拟上断言,那么根本不要使用模拟。他进一步演示了如何使用隔离框架来生成存根,这些存根与模拟类似。他没有对每次测试创建的存根数量建议限制。
我的问题是:这些建议可以应用于所有隔离框架(或所有流行的C#框架)吗?换句话说,是否有一个只能生成模拟的框架 - 而不是存根?是否有一个隔离框架,不区分模拟和存根?
我很好奇Osherove的建议可以很容易地转换成编码标准。
[1]:http://the系统甚至根本没有进行测试,而是从模拟中返回的数据正在测试中。
答案 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 ?
我认为:如果你假设这些定义,大部分时间都是是
答案 4 :(得分:0)
答案 5 :(得分:0)
这种规则应被视为“训练轮”。显然,包含许多存根和模拟的测试已经失去了情节,但坚持每次测试的一个断言或期望只是限制太多。正如引用的Calçado链接指出的那样,重要的是每次测试都有一个概念,这可能涉及一些断言或期望来说明问题。你应该做的最后一件事是强制执行这样的标准。
还有一件事,我们真的应该在这里谈论“期望”,个人互动,而不是整个模拟对象。在实践中,它们通常是相同的,但它模糊了概念。
答案 6 :(得分:-1)
我在C#中使用Rhino mock进行测试。您可以使用它生成模拟或存根。我建议你看看这个框架:http://www.ayende.com/projects/rhino-mocks.aspx