我有一个路由,我使用约束来检查主机,然后是一个基本相同但没有主机限制的路由(这些实际上是命名空间,但为了使事情变得简单,这个例子会做):
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 的主机部分,并且测试将出错了。