【问题标题】:Stub controller action in Rspec controller test, but it's still executedRspec 控制器测试中的存根控制器操作,但仍执行
【发布时间】:2011-07-09 11:51:04
【问题描述】:

我想测试是否实际调用了控制器操作,而在某些 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

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

【问题讨论】:

标签: rspec stub stubbing


【解决方案1】:

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

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

controller.should_receive(:show)
get :show

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多