Ruby on rails 更具可读性/可理解性的方式来定义在发布前是否应该收到期望

Ruby on rails 更具可读性/可理解性的方式来定义在发布前是否应该收到期望,ruby-on-rails,rspec,rspec2,Ruby On Rails,Rspec,Rspec2,我有一种方法可以设定对模拟对象的期望值,但这让我觉得有点奇怪 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

我有一种方法可以设定对模拟对象的期望值,但这让我觉得有点奇怪

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部分


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

你的第二个例子不起作用,因为这是一个鸡和蛋的问题。您在
post
调用后设置了一个对象的期望值,这是导致该对象首先被分配的原因。您不能仅仅交换行,因为
赋值
尚未返回任何内容

如果您不关心是否调用“按传真id查找”,那么最好的方法是调用
FaxEvent.stub(:按传真id查找)。然后返回(…)
,但这并不是更好的方法

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

FaxEvent.any_instance.expects(:notify_failure)
post :create, :TransactionID => @fax_event.fax_id
它允许您跳过恼人的“查找我的模拟对象,而不是您实际找到的对象”步骤


另外,
:TransactionID
违反了命名约定,应该是
:transaction\u id

谢谢,我会去看看摩卡咖啡;我被测试框架弄得不知所措。至于TransactionID,它是通过一个我无法控制的外部服务发布到控制器中的,因此我对此无能为力:)将在授予答案之前等待其他人是否有话要说,谢谢您的评论。