如何用双倍替换存根?

时间:2014-12-19 23:42:33

标签: rspec stubbing

我想测试一个包含方法MessageMailer.message_notification(self).deliver的方法。 MessageMailer有点慢,我写的测试不是测试它,所以我希望交付不在测试块中运行。

目前,我通过将其删除来实现这一目标。

before do
  mail = double('email', deliver: true)
  MessageMailer.stub(:message_notification) { mail }
end

但是我已经听说将来会将stub替换为double,并且MessageMailer.double(:message_notification)在我的Rspec版本(2.12.2)中因NoMethodError而失败。我应该如何使用double重写此代码以防止调用传递方法?

1 个答案:

答案 0 :(得分:1)

您可以使用https://relishapp.com/rspec/rspec-mocks/v/3-1/docs中所述的allow'方法存根':

before do
  mail = double('email', deliver: true)
  allow(MessageMailer).to receive(:message_notification) { mail }
end

您也可以按https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/message-chains

中所述使用receive_message_chain
before { allow(MessageMailer).to receive_message_chain(:message_notification, :deliver => true) }

但请注意关于得墨忒耳定律,脆性等的相关警告