规范中使用Rails默认异常转换



我的控制器正在抛出ActiveRecord::RecordNotFound,这是预期转换为404的内容。

现在我想在我的控制器规范中测试这种行为,但它得到了异常,而不是等于404的response_code。如何使它获得此代码?

Rails引发ActiveRecord::RecordNotFound时,它只是告诉您ActiveRecord无法在数据库中找到资源(通常使用find)。

您有责任捕获异常并执行您想做的任何事情(在您的情况下,返回404未找到的http错误)。

说明上述内容的一个简单实现是通过执行以下操作:

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  rescue_from ActiveRecord::RecordNotFound, with: :not_found
  private
  def not_found
    render file: 'public/404.html', status: 404, layout: false
  end
end

这样,每当rails从继承自ApplicationController的任何控制器抛出ActiveRecord::RecordNotFound时,它都会被拯救,并呈现位于public/404.html 的404 rails默认页面

现在,为了测试这个:

spec/controllers/application_controller_spec.rb

require 'spec_helper'
describe ApplicationController do
  describe "ActiveRecord::RecordNotFound exception" do
    controller do
      def index
        raise ActiveRecord::RecordNotFound.new('')
      end
    end
    it "calls not_found private method" do
      expect(controller).to receive(:not_found)
      get :index
    end
  end
end

您需要在spec/spec_helper.rb 中添加以下内容

config.infer_base_class_for_anonymous_controllers = true

最新更新