在帖子之前定义should_receive期望的更可读/可理解的方式

时间:2011-04-20 04:35:56

标签: ruby-on-rails rspec rspec2

我有办法在模拟对象上设置should_receive期望值,但它让我感到有些奇怪。

def mock_fax_event(stubs={})
  @mock_fax_event ||= mock_model(FaxEvent, stubs)
end

it "should notify facility/admin of failed faxes" do
  FaxEvent.should_receive(:find_by_fax_id).with(@fax_event.fax_id).and_return(mock_fax_event(:notify_failure => true))
  mock_fax_event.should_receive(:notify_failure)
  post :create, :TransactionID => @fax_event.fax_id
end

对我来说,我想做类似以下的事情,但它不起作用:

it "should notify facility/admin of failed faxes" do
  post :create, :TransactionID => @fax_event.fax_id
  assigns(:fax_event).should_receive(:notify_failure)
end

我想我理解为什么以上不起作用,但我认为我现在这样做的方式还不清楚。我还想测试是否实际调用了notify_failure,而不是find_by_fax_id部分。

有没有更好的方法来做我想做的事情?

1 个答案:

答案 0 :(得分:1)

你的第二个例子不起作用,因为这是一个鸡和蛋的问题。您在 post调用之后设置对象的期望,这是导致该对象首先被分配的原因。而且你不能只交换行,因为assigns还没有任何东西可以返回。

如果您不关心是否调用了find_by_fax_id,那么您可以做的最好就是致电FaxEvent.stub(:find_by_fax_id).and_return(...),但这并不是更好。

这是我喜欢使用Mocha的原因之一。你可以这样做:

FaxEvent.any_instance.expects(:notify_failure)
post :create, :TransactionID => @fax_event.fax_id

它可以让你跳过烦人的“找到我的模拟对象而不是你实际找到的对象”步骤。

此外,:TransactionID违反了命名惯例,它应该是:transaction_id