如何测试请求不会返回500错误?

时间:2017-03-17 14:47:37

标签: ruby-on-rails ruby rspec rspec-rails

我正在尝试创建一个RSpec测试,用于检测请求是否会导致控制器崩溃,通常是500错误。所以我希望能够区分:

 nil.invalid_method # raises NoMethodError

 params.require(:required_parameter) # raises ActionController::ParameterMissing

以通用方式在控制器中。当我执行requestfeaturecontroller测试时,会引发异常:

describe "Post", type: :request do
  it 'does not crash when no params given' do
    post '/posts' # this line launches an exception
    expect(page).to_not have_http_status(500)
  end
end

似乎在RSpec(或Rails我不知道)之前有不同的行为,类似于我正在寻找:

我该怎么做?或者你会怎么做?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

您可以使用不会渲染500的控制器规范,但会引发异常:

describe "PostController", type: :controller do
  describe "POST index" do
    it 'does not crash with valid params' do
      expect {
        post :index, { post: { title: 'foo' } }
      }.to_not raise_exception 
    end
  end

  describe "POST index" do
    it 'crashes without params' do
      expect {
        post :index
      }.to raise_exception(ActionController::ParameterMissing)
    end
  end
end

另请注意{ ... }之后的大括号expect

答案 1 :(得分:0)

您可以使用raise_error匹配器测试控制器是否未引发未捕获的异常:

RSpec.describe "Things", type: :request do
  describe "POST /things" do
    it "does not raise an error" do
      # we pass a block to expect
      expect { post things_path }.to_not raise_error
    end
  end
end

如果使用rescue关键字或Rails rescue_from在控制器中挽救了异常,您将照常测试响应代码:

class ThingsController < ApplicationController
  rescue_from ActionController::ParameterMissing do
    head 500
  end

  def create
    raise ActionController::ParameterMissing.new('foo')
  end
end

RSpec.describe "Things", type: :request do
  describe "POST /things" do
    it "work even if the param is not provided" do
      post things_path
      expect(response).to successful
    end
  end
end

在这种情况下,测试响应是否符合预期更有用 - 而不是它不是500。