Rspec控制器具有相同名称的命名空间

我有以下设置:

class UsersController < ApplicationController ... end class Admin::BaseController < ApplicationController ... end class Admin::UsersController < Admin::BaseController ... end 

同样的规格:

 #spec/controllers/users_controller_spec.rb: describe UsersController do ... end #spec/controllers/admin/users_controller_spec.rb describe Admin::UsersController do ... end 

所有规格在独立运行时运行良好,但是当我一起运行时,我收到警告:

 toplevel constant UsersController referenced by Admin::UsersController 

管理员控制器的规格没有通过。

路线文件:

 ... resources :users namespace "admin" do resources :users end 

Rails 4,Rspec 2.14

我可以不为不同命名空间中的控制器使用相同的名称吗?

当顶级类在使用命名空间类之前进行自动加载时会发生这种情况。 如果你有这个代码没有预加载任何类:

 UsersController module AdminArea UsersController end 

第一行将触发常量缺失钩子:“好吧,UsersController不存在,所以让我们尝试加载它”。

但是,到达第二行,UsersController确实已经在顶级定义。 因此,没有触发const_missing钩子,app会尝试使用已知的常量。

为避免这种情况,请在spec文件的基础上明确要求使用适当的类:

 #spec/controllers/users_controller_spec.rb: require 'users_controller' 

 #spec/controllers/admin/users_controller_spec.rb require 'admin/users_controller'