在Rspec控制器测试中存在存根控制器操作,但它仍然执行
我想测试一下控制器操作是否在某些before_filter中没有发生重定向时实际调用。由于控制器操作本身可能会执行重定向操作,因此我希望存储操作以引发特定错误(SuccessfulActionError或类似操作),然后检查该错误是否为调用该方法的指示符。在Rspec控制器测试中存在存根控制器操作,但它仍然执行
因此,我增加了以下内容:
controller.stub!(:action).and_raise(SuccessfulActionError)
它的工作原理莫名其妙,异常被引发,但该方法的实际代码仍在执行(例如,如果我在的的ID发送不存在记录到'show'动作,它会抛出一个ActiveRecord :: RecordNotFound异常)。
这是为什么?我想完全残留的行动,如果它被实施为
def action
raise SuccessfulActionError
end
我做错了什么?这是错误的方法?
编辑:
使用
controller.should_receive(:action)
也不起作用。
我覆盖在这样的before_all过滤器来解决未从ApplicationController中拿起default_url_options:
class MyController
def default_url_options(options = {})
{ :locale => params[:locale] }
end
end
莫非是罪魁祸首?当我不幸地移除它时,规格根本无法使用。
我不清楚在保存方法后如何得到ActiveRecord :: RecordNotFound异常。存根应该替换方法调用。
作为一种替代方法,您可以考虑对动作设置消息期望值,例如,
controller.should_receive(:show)
get :show
如果before_filter阻止操作被调用,应该会失败。
感谢您的建议。我尝试过,不幸的是有了一些结果... – 2011-03-10 15:16:48
我有同样的问题在http://*.com/questions/5881459/how-to-test-that-a-before-filter-works-correctly-with-rspec-in-rails,有你找到了解决方案吗? – Kostas 2011-05-04 09:52:35