我有一个路由,我使用约束来检查主机,然后是一个基本相同但没有主机限制的路由(这些实际上是命名空间,但为了使事情变得简单,这个例子会做):

 match "/(:page_key)" => "namespace_one/pages#show", :constraints => proc {|env| env['SERVER_NAME'] == 'test.mysite.local' }

 match "/(:page_key)" => "namespace_two/pages#show"

这些在通过浏览器访问时和在定义主机和执行 get "/page_key" 等的集成测试中完全按预期工作。

但是,我想编写测试以确保这些路由到目前为止有效,因为以下测试(目前在 ActionController::IntegrationTest 中,因此我可以设置主机)与没有约束的测试相匹配:
assert_routing '', { :controller => 'namespace_one/pages', :action => 'show' }
=> The recognized options <{"action"=>"show", "controller"=>"frontend/pages"}>
   did not match <{"action"=>"show", "controller"=>"namespace_two/pages"}>,
   difference: <{"controller"=>"namespace_one/pages"}>

如果我尝试在约束过程中转储 env,我得到的只是 --- :controller

如果我摆脱了 assert_routing 并只调用 get :show 并将 @controller 转储到正确的 Controller (正如预期的那样,因为这些路由都可以通过 HTTP 请求正常工作)。

最佳答案

自己刚遇到这个问题。这是由 Rails 补丁修复的,该补丁允许您在路由测试中指定完整的 url。
将您的测试更改为

assert_routing 'http://test.mysite.local', { :controller => 'namespace_one/pages',
                                             :action => 'show' }
它会正常工作。
您必须在完整的 url 中包含“://” b/c rails 使用正则表达式在路径中查找 %r{://} 否则它会自动破解 url 的主机部分,并且测试将出错了。

10-08 09:32