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

如何在Rails Minitest中为Devise登录及请求指定特定主机

解决方法

要让sign_in和get操作都在指定主机下执行,核心是先绑定测试请求的主机上下文,再执行认证和请求操作,具体改写如下:

单个测试用例的改写

test "has proper credentials as shop manager" do
  # 获取目标站点的主机地址(假设sites是你加载的fixture)
  target_host = sites(:one).host
  
  # 设置当前测试请求的主机,让后续请求和认证都基于该主机上下文
  host! target_host

  # 在正确的主机上下文内执行sign_in,确保会话绑定到目标主机
  sign_in users(:chain_manager_shop_one)

  # 调用路由助手时显式指定host,确保生成目标主机的URL
  get chain_manager_minitests_url(id: shops(:one).id, host: target_host)
  
  assert_response :success
end

关键说明

  • host!是Rails集成测试提供的方法,用来设置后续所有请求的默认主机。Devise的sign_in会基于当前请求的主机上下文创建会话,因此必须先调用host!再执行sign_in。
  • 调用路由助手时显式传递host参数,能确保生成的URL完全匹配目标主机,避免使用Rails默认的www.example.com。
  • 如果多个测试需要统一使用某一主机,可以在测试类的setup方法中设置全局默认值,减少重复代码:
module ActiveSupport
  class TestCase
    include Devise::Test::IntegrationHelpers

    def setup
      # 可根据测试场景动态调整主机,比如通过fixture或测试参数切换
      default_url_options[:host] = sites(:one).host
    end
  end
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:16:03