Rails应用程序运行正常,但RSpec无法匹配路由

时间:2017-10-12 13:38:54

标签: ruby-on-rails ruby-on-rails-4

我有一个相当简单的控制器' ActivityLogsController'在' Admin'命名空间。运行rails server时,一切都按预期工作,我可以访问 / admin / activity_logs 等路由。当我运行RSpec控制器规范时,每个动作测试都会返回失败。例如:

 Failure/Error: get :index

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

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

routes.rb 将activity_logs条目正确命名为:

 namespace :admin do
   resources :activity_logs, except: [:show, :destroy]
 end

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

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

class Admin::ActivityLogsController < ApplicationController
   ...
end

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

我发布这个答案,以防其他人在其他问题中找不到他们需要的内容。

1 个答案:

答案 0 :(得分: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 子目录,以及包含的相关(自动创建的)模块( ActivityLog OtherController 或根ActivityLogsController似乎用于错误地生成 Admin :: ActivityLogsController 路由和操作。这种混合物中的某些东西可能会产生一个超出预期值的 admin / activity_logs_path

因此,即使对问题原因的快速分析在某种程度上是不准确的,解决方案是将根 activity_logs_controller.rb 文件移动到另一个命名空间。幸运的是,我只是使用那个控制器作为一个超级类,我将其子类化为其他控制器,所以移动很容易。正如我所预料的那样,有多个名字相同的东西让我感到困惑,而RSpec。