ruby-on-rails - RSpec中response和last_response的区别
问题描述
我有一个测试来检查请求的页面是否返回 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
解决方案
response
由 提供ActionController::TestCase
。
从文档:
一个 ActionDispatch::TestResponse 对象,表示最后一个 HTTP 响应的响应。
作为参考,这里是控制器测试的 rspec 文档。这可能有助于弄清楚response
应该如何使用。
last_response
来自Rack::MockResponse < Rack::Response
从文档:
返回会话中收到的最后一个响应。如果尚未发送任何请求,则引发错误。
在您的测试用例中,您可能使用了一种允许您模拟访问页面的方法。这会将您设置response.status
为200
您的请求成功。如果您随后使用 Rack 来刺激端点,例如:
put '/users', {my_user: 'blah'}
并且您使用不正确的参数进行操作,那么您last_response.status
将是422
.
最终,混淆归结为 and 之间命名的相似性ActionController
,Rack::MockResponse
我同意这相当令人困惑。
推荐阅读
- java - Java 的日志/预写日志技术
- php - 代码点火器如何在点击任何页面或 url 时将浏览器信息和 url 保存在错误日志文件中?
- sql - 需要通过在 SQL Server 中组合 DATEDIFF(hh,StartTime,EndTime) + 'Minutes' 来输出
- java - 用于划分数学函数的正则表达式
- ruby-on-rails - 创建索引前的回调
- javascript - 使用 tmi.js 的 Twitch Bot 游戏我希望对我的阵列有一些帮助(获胜者)
- shopify - Shopify:将值从非 Shopify 站点传递到 Shopify Checkout 并获取 URL
- github-pages - 有没有办法在安装时传递存储 helm 图表的 github 存储库凭据?
- angular - 具有双倍滚动内容的 Angular Material Sidenav
- python - 将索引选择的 numpy 数组添加到另一个具有重叠索引的 numpy 数组