Rspec通配符及子域名路由重定向测试失败如何解决
问题原因
出现该报错的核心原因是测试请求未命中你配置的域名约束规则,导致路由匹配失败,常见触发场景有3种:
- 测试环境的
Rails.configuration.env.sub_domain配置项未赋值/赋值和浏览器访问时用的域名不一致,约束校验不通过 - 你当前使用的Rails版本中,request测试手动传
Host请求头的方式,无法被server_name约束正确识别 - 路由配置中
constraints块缺少闭合end(你浏览器能正常访问的话大概率是粘贴代码时漏写)
修复方案
1. 优先调整测试请求写法
不用手动传入Host头,直接调用get方法时通过host参数指定域名即可,调整后的测试代码如下:
RSpec.describe "any routes should be redirected", type: :request do context "redirect" do it "success" do get "/example", host: Rails.configuration.env.sub_domain response.should redirect_to("https://example/fuga") end end end
2. 兜底兼容方案
如果调整测试写法后还是报错,可以修改路由的约束规则,改用lambda直接读取请求host匹配,兼容性更强:
constraints ->(req) { req.host == Rails.configuration.env.sub_domain } do get '*any' => redirect("https://example/fuga") end
修改后执行测试前要确认测试环境的Rails.configuration.env.sub_domain配置值和你浏览器验证时用的域名完全一致,不要带协议前缀、端口、路径后缀。
内容的提问来源于stack exchange,提问作者bluecat
相关产品推荐
相关产品推荐

