RSpec中响应和last_response之间的差异

时间:2018-04-25 16:42:10

标签: ruby-on-rails rspec-rails

我有一个测试,检查请求的页面是否返回200状态代码:

expect(response).to have_http_status(:success)

但是,如果我使用以下测试显式返回不同的状态代码:

return render json: { error: 'error message' }, status: :unprocessable_entity

它仍然通过。

为什么responselast_response具有不同的状态:

response.status      # 200
last_response.status # 422

1 个答案:

答案 0 :(得分:3)

responseActionController::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

最终,混淆了ActionControllerRack::MockResponse之间命名的相似性,我同意这是相当混乱的。