我有一个相当简单的控制器' 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控制器规范无法正确解析路由?
我发布这个答案,以防其他人在其他问题中找不到他们需要的内容。
答案 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。