ruby-on-rails - 在 Rails 集成测试中存根 `session_id`
问题描述
我有一个关于 Rails 集成测试的问题。我有这个应用程序可以与这个其他内部应用程序对话。
应用程序向 internal_app 发出请求,该请求的参数之一涉及存储在会话 cookie 中的 session_id。由于各种原因,对外部服务的请求被使用webmock
和vcr
gems 排除。这会将请求/响应记录到夹具文件中,以便下次运行请求时,它会命中夹具文件而不是真正的服务。
我的问题是session_id
每次运行测试时都会发生变化。这意味着,根据 webmock,发出的请求与存根的请求不匹配,从而导致测试失败。在控制器测试中,我可以直接访问会话,并根据需要更改/存根任何我想要的东西。通过集成测试,我无法直接访问会话,因此我无法使用 Rails 为测试生成的任何 session_id。有谁知道修改/存根用于集成测试的 session_id 达到预期效果的好方法?我正在考虑一些不太受欢迎的方法(例如,涉及为那些集成测试放弃 vcr gem),但我更愿意找到一种方法让 session_id 成为一些预期值。
在 Rails 5.1 应用程序上使用 Capybara/Poltergeist/phantomjs 进行测试。
解决方案
您真的不应该在集成测试期间对应用程序的内部进行存根,因为它确实破坏了集成测试的要点。但是,您可以将 VCR 配置为在匹配请求时使用:match_requests_on
选项忽略 session_id - https://relishapp.com/vcr/vcr/docs/request-matching - 然后使用动态磁带 - https://relishapp.com/vcr /vcr/v/3-0-3/docs/cassettes/dynamic-erb-cassettes - 必要时在响应中插入正确的 session_id
推荐阅读
- java - java 8过滤ListOfMap以检查键是否存在,如果存在则收集地图
- python - 采用背景颜色时如何更改按钮颜色?
- python - 安装emscripten需要什么版本的python?
- intellij-idea - 无法使用 gradle 将 YAML 添加到 Intellij
- dynamics-crm - 访问/导出 CRM 365 审计日志数据
- javascript - 如何缓存文本区域?
- javascript - 使用同一组件中的方法在 Vue 组件中查找特定数据时遇到问题
- ignite - Apache Ignite 瘦客户端事件
- python - 为什么 Sentry 推荐的 Django 日志记录配置使来自 django.db.backends 的日志记录静音?
- javascript - js如何在屏幕上移动动画