4

我想测试是否实际调用了控制器操作而没有在某些 before_filter 中发生重定向。由于控制器操作本身可能会执行重定向,因此我想对操作进行存根以引发特定错误(SuccessfulActionError 或类似错误),然后检查该错误作为调用该方法的指示符。

所以我添加了以下内容:

controller.stub!(:action).and_raise(SuccessfulActionError)

以某种方式工作,正在引发异常,但该方法中的实际代码仍被执行(例如,如果我将不存在的记录的 id 发送到“显示”操作,它会引发 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

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

4

1 回答 1

0

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

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

controller.should_receive(:show)
get :show

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

于 2011-03-06T10:12:24.710 回答