4

我有一个路由,我使用约束来检查主机,然后是一个本质上相同但没有主机限制的路由(这些实际上是命名空间,但是使事情变得简单这个例子也可以):定义主机,做时通过浏览器和集成测试访问时通过Rails中的assert_routing测试具有主机约束的路由

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"

但是我想写确保这些测试路线工作到目前为止我没有多少运气,因为下面的测试(目前在在限制PROC我得到的是--- :controller

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:,所以我可以设置主机)不匹配的约束之一。

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

回答

6

自己就有这个问题。这是通过Rails补丁修复的,它允许您在路由测试中指定完整的URL。

测试改为

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

,它会正常工作。

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

这里是relavent补丁http://tinyurl.com/28erq86