我正在尝试创建一个RSpec测试,用于检测请求是否会导致控制器崩溃,通常是500错误。所以我希望能够区分:
nil.invalid_method # raises NoMethodError
这
params.require(:required_parameter) # raises ActionController::ParameterMissing
以通用方式在控制器中。当我执行request
,feature
或controller
测试时,会引发异常:
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我不知道)之前有不同的行为,类似于我正在寻找:
我该怎么做?或者你会怎么做?
感谢您的时间。
答案 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。