2009-09-10 65 views

回答

30

我真的很喜欢的一个特定功能是能够将一个类的所有实例都删除。很多时候,我像做使用RSpec以下嘲笑:

stub_car = mock(Car) 
stub_car.stub!(:speed).and_return(100) 
Car.stub!(:new).and_return(stub_car) 

与摩卡变成:

Car.any_instance.stubs(:speed).returns(100) 

我找到摩卡版本更清晰,更明确。

+1

any_instance可能是*使用摩卡的原因。它非常强大,可以节省大量时间。 – 2009-09-13 06:18:17

+19

您现在可以使用RSpec 2完成此操作:https://www.relishapp。com/rspec/rspec-mocks/docs/method-stubs/stub-on-any-instance-of-a-class – 2011-09-14 18:51:09

+3

是的,这个答案已经过时。是否有可能“取消”它? – 2013-08-20 21:37:09

3

我一个人使用摩卡,因为我不使用rspec。我使用测试/单元,测试/单元没有内置的stubbing和mocking。

+1

[Rspec-mocks](https://github.com/rspec/rspec-mocks)现在是一个可以在任何非Rspec项目中使用的独立项目。 – 2013-08-20 21:38:18

4

据我所知,Mocha支持双重喷射(又名部分模拟,它也支持rr),不确定RSpec是否也支持这个功能。另外,对于那些更喜欢在测试框架之间切换的人,Mocha是适用于测试/单元,Shoulda等的通用解决方案。使用RSpec模拟所有这些库将会是一个矫枉过正的问题。

+1

[Rspec-mocks](https://github.com/rspec/rspec-mocks)现在是一个可以在任何非Rspec项目中使用的独立项目。 – 2013-08-20 21:40:59

36

红宝石嘲讽框架已经进化了很多,因为这个问题已经在2009年被要求所以这里是一个小2013比较:

预期

  • 使用RSpec-嘲笑:expect(user).to receive(:say_hello)
  • 与摩卡:user.expects(:say_hello).once

打桩对象

  • 与Rspec的-嘲笑:user = double(name: 'John Doe')
  • 与摩卡:user = stub(name: 'John Doe')

打桩任何

  • 与Rspec的-嘲笑:User.any_instance.stub(:name).and_return('John Doe')
  • 与摩卡:User.any_instance.stubs(:name).returns('John Doe')

他们提供相同的设施,都可以使用带或不带Rspec。
所以我会说选择一个在另一个是个人品味的问题(和他们的味道很相似)。

+1

有一些具体的比较非常有用,+1 – 2014-08-05 21:50:00