该response
对象以消息的形式响应几种符号类型。所以你可以简单地做:
expect(response).to be_success
expect(response).to be_error
expect(response).to be_missing
expect(response).to be_redirect
对于其他类型,例如:created
,您可以为此创建一个简单的自定义匹配器,其中包含assert_response
:
RSpec::Matchers.define :have_status do |type, message = nil|
match do |_response|
assert_response type, message
end
end
expect(response).to have_status(:created)
expect(response).to have_status(404)
对于具有正确状态设置的控制器规格,这应该可以正常工作。它不适用于功能规格。我没有尝试过请求规格,所以你的里程可能会有所不同。
这样做的原因是它利用了 RSpec 控制器规范在幕后具有类似状态设置的事实。所以当assert_response
访问@response
它是可用的。
只需将使用的代码复制到匹配器中即可改进此匹配assert_response
器:
RSpec::Matchers.define :have_status do |type, message = nil|
match do |response|
if Symbol === type
if [:success, :missing, :redirect, :error].include?(type)
response.send("#{type}?")
else
code = Rack::Utils::SYMBOL_TO_STATUS_CODE[type]
response.response_code == code
end
else
response.response_code == type
end
end
failure_message do |response|
message or
"Expected response to be a <#{type}>, but was <#{response.response_code}>"
end
end
更新:2014-07-02
现在可以使用 RSpec Rails 3 开箱即用:https ://www.relishapp.com/rspec/rspec-rails/v/3-0/docs/matchers/have-http-status-matcher