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

时间:2013-09-26 11:38:20

标签: ruby-on-rails 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

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

1 个答案:

答案 0 :(得分:24)

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

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'