使用rspec,混淆了mock和stub对象之间的区别?

时间:2011-05-19 16:53:38

标签: ruby-on-rails rspec

模拟和存根有什么区别,它们看起来和我很相似?

如果有人可以给出一个真实世界的例子,告诉他们什么时候使用哪个,或者它们是否可以互换,但是有一个最好的做法,例如何时使用模拟或存根,这将是很好的。

3 个答案:

答案 0 :(得分:7)

这是大多数文章中的参考,非常通用且清晰的解释:

http://martinfowler.com/articles/mocksArentStubs.html

简而言之:

  

存根提供呼叫的固定答案   在测试期间制作,通常不是   完全回应任何外面的事情   什么是为测试编程的。   存根也可以记录信息   关于电话,例如电子邮件网关   记住消息的存根   '发送',或者可能只有多少   它发送的消息。

  

模拟是预先编程的对象   期望形成一个   他们的电话规范   期待收到。

答案 1 :(得分:1)

提供的文章和提出的问题来自不同的背景。关于Rspec的领域,The Rspec Book的作者在第14.1节中写道:

“要创建一个double,只需使用double()方法,如下所示:

thingamajig_double = double('thing-a-ma-jig')

...还有stub()mock()方法,生成相同类型的对象

stub_thingamajig = stub('thing-a-ma-jig')
mock_thingamajig = mock('thing-a-ma-jig')

我们可以使用它们在适当的时候使规范更清晰。“(强调我的)

作者还在ch 14.3中包含了一段代码片段 -

describe Statement do
  it "logs a message on generate()" do
    customer = stub('customer')
    customer.stub(:name).and_return('Aslak')
    logger   = mock('logger')
    statement = Statmement.new(customer, logger)

    logger.should_receive(:log).with(/Statement generated for Aslak/)

    statement.generate
  end
end

然后写“通过使用mock()方法生成记录器double和stub()方法来生成客户double,我们正在帮助表达这些对象正在播放不同角色在示例中。“ (强调我的)

这些代码片段和解释让我相信,虽然福勒先生在他的文章中绘制的概念线是很好的,但stub()mock()之间没有功能的区别在Rspec中double()(或{{1}},就此而言)。可能是错的,我还没有查看文档。

答案 2 :(得分:0)

stub:

A fake object that returns a pre-determined value for a method call.
Actual object is not called.


Stubs and mocks often used interchangeably.
Mean two different things.
But people generally refer to "Mock Object Frameworks"

Product.stub(:find_by_title).with('orange').and_return(Product.new(:title=>"orange", :price=>6.23))

Mocks:

Just like Stubs, but with an expectation to be (or not to be) called.

Test will fail if the mock is (or isn't) called.

Used in the same way as stubs,

Product.should_receive(:find_by_title).with('orange').exactly(2).and_return(Product.new(:title=>"orange", :price=>6.23))

To know more about mock and stub please refer this article, 
http://www.ibm.com/developerworks/web/library/wa-mockrails/index.html