2017-10-12 89 views
0

我在'Admin'命名空间中有一个相当简单的控制器'ActivityLogsController'。当运行rails server一切都按预期工作,我可以访问路线,如/管理/活动日志。当我运行RSpec控制器规格时,每个动作测试都会返回一个失败。例如:Rails应用运行正常,但RSpec未能匹配路由

Failure/Error: get :index 

ActionController::UrlGenerationError: 
    No route matches {:action=>"index", :controller=>"activity_logs"} 

好的,我承认这看起来有点奇怪,没有显示:控制器值被命名空间。这显然是问题的一部分。

routes.rb中有activity_logs进入正确的命名空间:

​​

当然,运行rake routes给了我预期的命名空间的路线,这反映了服务器正常运行的事实。

控制器在'app/controllers/admin/activity_logs_controller.rb'中定义,反映其名称空间。它被定义为:

class Admin::ActivityLogsController < ApplicationController 
    ... 
end 

那么,为什么RSpec控制器规范无法正确解析路由?

如果其他人未能在其他问题中找到他们需要的东西,我正在发布这一个答案。

回答

0

经过一段时间的挖掘Rspec Controllers in and out of namespace with same name给了我一个线索,虽然不是我的情况下的实际答案。

我的问题是,除了在命名空间中使用我的控制器之外,我在控制器根目录中有一个单独的控制器,其名称相同,名称为。加上混淆的问题,我也有含有其他控制器命名空间,称为(容易混淆)activity_log

所以我不得不:

controllers 
| 
|- admins 
| |- activity_logs_controller.rb 
| 
|- activity_log 
| |- other_controller.rb 
| 
|- activity_logs_controller.rb 

如此看来,Rails的自动加载工作,因为我本来希望运行服务器时。它会将控制器放到正确的位置并识别路由中的适当命名空间。

但是,当来到RSpec的控制器测试负载量为不同的,并且在RSpec的深某处activity_log子目录,以及相关的(自动创建的)模块包含OtherController,或根ActivityLogsController(ActivityLog)似乎用于错误地生成路由和操作。此混音中的某些内容大概会生成一个admin/activity_logs_path,它会覆盖预期的内容。

因此,即使以某种方式对问题原因的快速分析是不准确的,解决方案是将根文件移动到另一个命名空间的根目录activity_logs_controller.rb文件。幸运的是,我只是使用该控制器作为一个超类,从中我分类了其他控制器,所以此举很简单。正如我应该预料的那样,有多个命名相同的东西让我感到困惑,RSpec。

相关问题