首页 > 解决方案 > 在 Rails 集成测试中存根 `session_id`

问题描述

我有一个关于 Rails 集成测试的问题。我有这个应用程序可以与这个其他内部应用程序对话。

应用程序向 internal_app 发出请求,该请求的参数之一涉及存储在会话 cookie 中的 session_id。由于各种原因,对外部服务的请求被使用webmockvcrgems 排除。这会将请求/响应记录到夹具文件中,以便下次运行请求时,它会命中夹具文件而不是真正的服务。

我的问题是session_id每次运行测试时都会发生变化。这意味着,根据 webmock,发出的请求与存根的请求不匹配,从而导致测试失败。在控制器测试中,我可以直接访问会话,并根据需要更改/存根任何我想要的东西。通过集成测试,我无法直接访问会话,因此我无法使用 Rails 为测试生成的任何 session_id。有谁知道修改/存根用于集成测试的 session_id 达到预期效果的好方法?我正在考虑一些不太受欢迎的方法(例如,涉及为那些集成测试放弃 vcr gem),但我更愿意找到一种方法让 session_id 成为一些预期值。

在 Rails 5.1 应用程序上使用 Capybara/Poltergeist/phantomjs 进行测试。

标签: ruby-on-railscapybaraintegration-testingsessionidwebmock

解决方案


您真的不应该在集成测试期间对应用程序的内部进行存根,因为它确实破坏了集成测试的要点。但是,您可以将 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


推荐阅读