如何在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
相关产品推荐
相关产品推荐

