我在'Admin‘命名空间中有一个相当简单的控制器'ActivityLogsController’。当运行/admin/activity_logs.时,一切都按预期工作,我可以访问像rails server这样的路由当我运行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/controllers/admin/activity_logs_controller.rb',中定义的。它的定义是:
class Admin::ActivityLogsController < ApplicationController
...
end那么,为什么RSpec控制器规范不能正确解析路由呢?
我贴出了这个答案,以防别人在其他问题上找不到他们需要的东西。
发布于 2017-10-12 13:38:53
在挖掘了一段时间之后,queston 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的关联(自动创建)模块(ActivityLog),或者根ActivityLogsController似乎被错误地用于生成RSpec路由和操作。这个组合中的某个东西可能产生了一个admin/activity_logs_path,它超越了预期的一个。
因此,即使对问题原因的快速分析在某种程度上是不准确的,解析也是将根activity_logs_controller.rb文件移动到另一个命名空间。幸运的是,我只将该控制器用作子类其他控制器的子类,因此移动非常简单。正如我所期望的那样,有多个相同的名称只是让我和RSpec感到困惑。
https://stackoverflow.com/questions/46711120
复制相似问题