【问题标题】:Stubbing `session_id` in Rails Integration Tests在 Rails 集成测试中存根 `session_id`
【发布时间】:2018-06-29 18:04:45
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails capybara integration-testing sessionid webmock


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我会尝试一下。我很好奇,您将如何处理存根/非存根问题?集成测试仍然命中控制器,控制器仍然执行尝试向外部服务发出请求的代码。在这种情况下,我认为外部服务请求仍然应该被存根?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多