使用 `bypass_rescue`

使用 `bypass_rescue` 来绕过 Rails 在控制器操作中对错误的默认处理,以及使用 `rescue_from` 语句声明的任何自定义处理。

这使你能够指定抛出异常的详细信息,而不管它可能在 upstream 如何处理。

背景

给定一个名为“spec/controllers/gadgetscontrollerspec_context.rb”的文件,其中包含

class AccessDenied < StandardError; end

class ApplicationController < ActionController::Base
  rescue_from AccessDenied, :with => :access_denied

  private

  def access_denied
    redirect_to "/401.html"
  end
end

使用 `rescue_from` 的标准异常处理

给定一个名为“spec/controllers/gadgetscontrollerspec.rb”的文件,其中包含

require "rails_helper"

require 'controllers/gadgets_controller_spec_context'

RSpec.describe GadgetsController, type: :controller do
  before do
    def controller.index
      raise AccessDenied
    end
  end

  describe "index" do
    it "redirects to the /401.html page" do
      get :index
      expect(response).to redirect_to("/401.html")
    end
  end
end

我运行 `rspec spec/controllers/gadgets_controller_spec.rb`

所有示例都应该通过。

使用 `bypass_rescue` 绕过 `rescue_from` 处理

给定一个名为“spec/controllers/gadgetscontrollerspec.rb”的文件,其中包含

require "rails_helper"

require 'controllers/gadgets_controller_spec_context'

RSpec.describe GadgetsController, type: :controller do
  before do
    def controller.index
      raise AccessDenied
    end
  end

  describe "index" do
    it "raises AccessDenied" do
      bypass_rescue
      expect { get :index }.to raise_error(AccessDenied)
    end
  end
end

我运行 `rspec spec/controllers/gadgets_controller_spec.rb`

所有示例都应该通过。