4

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

 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 转储到约束 proc 中,我得到的只是--- :controller.

如果我摆脱了 assert_routing 并且只是进行get :show调用并转储@controller它确实会解析到正确的控制器(正如预期的那样,这些路由都可以通过 HTTP 请求正常工作)。

4

1 回答 1

7

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

将您的测试更改为

assert_routing 'http://test.mysite.local', { :controller => 'namespace_one/pages', 
                                             :action => 'show' }

它会正常工作。

您必须在完整 url 中包含“://” b/c rails 使用正则表达式在路径中查找 %r{://} ,否则它将自动破解 url 的主机部分,并且测试将出错了。

于 2010-12-16T21:53:53.510 回答