You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 7升级后集成测试中会话在请求间重置问题求助

Rails 7测试环境会话每次请求后重置的解决办法
  • 问题根源:Rails 7的集成测试里,默认不会自动在JSON请求(as: :json)之间传递会话cookie,导致每次请求的会话都是全新的,和开发环境行为不一致。

  • 手动传递cookie(最直接的解决方式)
    在测试里把第一个请求的cookie存下来,第二个请求带上就能复用会话:

    test 'updates locale' do
      # 执行登录请求,保存返回的cookie
      login_res = post login_path, params: { email: user.email, password: user.password }, as: :json
      saved_cookies = login_res.cookies
    
      # 后续请求带上保存的cookie
      patch user_path(user), params: { user: { locale: 'en' } }, as: :json, cookies: saved_cookies
    end
    
  • 用认证辅助方法跳过登录请求(如果用Devise)
    要是项目用Devise做用户认证,直接用测试辅助方法sign_in,不用走登录接口就能设置好会话:

    test 'updates locale' do
      sign_in user
      patch user_path(user), params: { user: { locale: 'en' } }, as: :json
    end
    
  • 修改测试配置让会话自动保留
    在test/test_helper.rb里加一段配置,让集成测试自动跨请求保留会话:

    class ActionDispatch::IntegrationTest
      def setup
        @integration_session.cookie_jar.persist = true
      end
    end
    
  • 排查会话存储配置
    检查config/environments/test.rb,确保会话存储不是null_store(这个会直接禁用会话持久化),应该用cookie_store:

    Rails.application.configure do
      config.session_store :cookie_store, key: '_your_app_session'
      # 注释掉下面这行(如果存在的话)
      # config.session_store :null_store
    end
    

内容的提问来源于stack exchange,提问作者TTD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:20:26