我有一个测试,检查请求的页面是否返回200状态代码:
expect(response).to have_http_status(:success)
但是,如果我使用以下测试显式返回不同的状态代码:
return render json: { error: 'error message' }, status: :unprocessable_entity
它仍然通过。
为什么response
和last_response
具有不同的状态:
response.status # 200
last_response.status # 422
答案 0 :(得分:3)
response
由ActionController::TestCase
提供。
来自docs:
ActionDispatch :: TestResponse对象,表示最后一次HTTP响应的响应。
作为参考,here是控制器测试的rspec文档。这可能有助于澄清response
应该如何使用。
last_response
来自Rack::MockResponse < Rack::Response
来自docs:
返回会话中收到的最后一个回复。如果尚未发送请求,则会引发错误。
在您的测试用例中,您可能使用了一种允许您模拟访问页面的方法。这会将您的response.status
设置为200
,因为您已成功申请。然后,如果您使用Rack来刺激端点,例如:
put '/users', {my_user: 'blah'}
并且您使用不正确的参数执行此操作,然后您的last_response.status
将为422
。
最终,混淆了ActionController
和Rack::MockResponse
之间命名的相似性,我同意这是相当混乱的。