我想测试是否实际调用了一个控制器动作而没有在某些before_filter中发生重定向。由于控制器操作本身可能会执行重定向,因此我希望将操作存根以引发特定错误(SuccessfulActionError或类似错误),然后检查该错误作为调用该方法的指示符。
所以我添加了以下内容:
controller.stub!(:action).and_raise(SuccessfulActionError)
它以某种方式工作 ,异常被引发,但方法中的实际代码仍然被执行(例如,如果我将不存在的记录的id发送到'show'动作,它抛出一个ActiveRecord :: RecordNotFound异常)。
为什么?我想将操作完全存根,就像它实现为
一样def action
raise SuccessfulActionError
end
我做错了什么?这是错误的方法吗?
编辑:
使用
controller.should_receive(:action)
也不起作用。
我在这样的before_all过滤器中覆盖了Controller来修复默认的default_url_options,它们没有从ApplicationController中获取:
class MyController
def default_url_options(options = {})
{ :locale => params[:locale] }
end
end
这可能是罪魁祸首吗?不幸的是,当我删除它时,规格根本不起作用。
答案 0 :(得分:0)
我不清楚如何在存根方法后获得ActiveRecord :: RecordNotFound异常。存根应该替换方法调用。
作为替代方法,您可以考虑为操作设置消息预期,例如
controller.should_receive(:show)
get :show
如果before_filter阻止调用该操作,则该失败。