Rails 3.2引擎 - 在测试用例中不起作用的路由

时间:2013-01-11 15:38:38

标签: ruby-on-rails-3.2 functional-testing rails-engines rails-admin

我使用

在我的应用中安装了RailsAdmin引擎(根据维基的说明)
  

mount RailsAdmin :: Engine => '/ backend',:as => 'rails_admin'

我不得不从引擎扩展一个控制器来添加一个before_filter。 在开发中运行我的应用程序时,我的扩展程序和其他引擎功能正常运行。

但是我在使用Test :: Unit 为我的before_filter编写功能测试时遇到了问题。 过滤器在正确的时刻启动并按预期工作,但是一旦前面的过滤器“调整”的操作重定向到索引(这是预期的结果),我得到以下路由错误:

  

ActionController :: RoutingError:没有路由匹配{:controller =>“rails_admin / main”}

导致异常的代码在于引擎的方法重定向到索引或上一页(引用的种类);这是方法的代码

  

def back_or_index

     
    

如果params [:return_to] .presence

         
      

PARAMS [:的return_to]

    
         

否则

         
      

index_path

    
  
     

结束

我发现在开发中运行应用程序时,index_path触发的url_for调用提供了正确的 path_segments(即:: model_name =>'user'),以便下面的路由是匹配

   index GET|POST    /:model_name(.:format)                 rails_admin/main#index

另一方面,在运行测试时,不提供path_segments,因此在查找匹配路径时不满足:model_name 约束。

由于我是引擎新手,有人可以告诉我我缺少什么吗?

对我而言,看起来引擎应该考虑生成index_path的事实,但正如我所说的那样,我不是这方面的专家......

1 个答案:

答案 0 :(得分:2)

use_route 还不够:无论如何,对 index_path 的调用都失败了。

经过大量调试后,我还不完全确定为什么相同的代码在 test development 中都不起作用的根本原因。

我观察到开发中的 index_path 能够从请求的网址推断出 model_name ,而在中测试不是。

虽然很难看,但我的解决办法是在app / controllers / rails_admin / main_controller.rb中覆盖以下方法

module RailsAdmin
 class MainController

        # Override to fix a routing error when running tests
    def back_or_index
      if params[:return_to].presence && params[:return_to].include?(request.host) && (params[:return_to] != request.fullpath)
        params[:return_to]
      else
        # forward :model_name as default_url_options is not aware of it in tests
        index_path( :model_name => params[:model_name] )
      end
    end

 end
end

在我的MainController控制器规范中,我执行以下操作

put :edit, { :model_name => 'user', :id => root.id, :user => { :role => :root }, :use_route => :rails_admin }

这就是我的路线

  devise_for :users
  mount RailsAdmin::Engine => '/backend', :as => 'rails_admin'
  mount Rich::Engine => '/rich', :as => 'rich'

如果有人有更好的解决方案,分享会非常感激!