我有办法在模拟对象上设置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部分。
有没有更好的方法来做我想做的事情?
答案 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
。