首页 > 解决方案 > RSpec中response和last_response的区别

问题描述

我有一个测试来检查请求的页面是否返回 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

标签: ruby-on-railsrspec-rails

解决方案


response由 提供ActionController::TestCase

文档

一个 ActionDispatch::TestResponse 对象,表示最后一个 HTTP 响应的响应。

作为参考,这里是控制器测试的 rspec 文档。这可能有助于弄清楚response应该如何使用。


last_response来自Rack::MockResponse < Rack::Response

文档

返回会话中收到的最后一个响应。如果尚未发送任何请求,则引发错误。


在您的测试用例中,您可能使用了一种允许您模拟访问页面的方法。这会将您设置response.status200您的请求成功。如果您随后使用 Rack 来刺激端点,例如:

put '/users', {my_user: 'blah'}

并且您使用不正确的参数进行操作,那么您last_response.status将是422.

最终,混淆归结为 and 之间命名的相似性ActionControllerRack::MockResponse我同意这相当令人困惑。


推荐阅读