在Rspec控制器测试中存根控制器动作,但它仍然执行

时间:2011-03-05 17:27:32

标签: rspec stub stubbing

我想测试是否实际调用了一个控制器动作而没有在某些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

这可能是罪魁祸首吗?不幸的是,当我删除它时,规格根本不起作用。

1 个答案:

答案 0 :(得分:0)

我不清楚如何在存根方法后获得ActiveRecord :: RecordNotFound异常。存根应该替换方法调用。

作为替代方法,您可以考虑为操作设置消息预期,例如

controller.should_receive(:show)
get :show

如果before_filter阻止调用该操作,则该失败。