当还有一个名称相同的全局控制器时,为命名空间控制器创建控制器规范时,我遇到了一个奇怪的问题。
控制器名称为HomeController
和Backend::HomeController
。
请注意我尚未创建文件app/controllers/backend/home_controller.rb
,只有全局控制器存在app/controllers/home_controller.rb
因此,我希望测试会因错误而爆炸,但事实并非如此。它通过,全是绿色和快乐。
我的规格看起来像这样
#spec/controllers/backend/home_controller_spec.rb
require 'rails_helper'
RSpec.describe Backend::HomeController, type: :controller do
before do
user = FactoryGirl.create(:user)
allow(controller).to receive(:authenticate_user!).and_return(true)
allow(controller).to receive(:current_user).and_return(user)
end
describe "GET #index" do
it "returns http success" do
get :index
expect(response).to have_http_status(:success)
end
end
end
但是,如果我将全局HomeController
中的名称更改为其他内容,例如NotMyHomeController
,则测试失败并显示错误
Unable to autoload constant HomeController, expected app/controllers/home_controller.rb to define it
这使我怀疑Rspec不会对Rspec.describe
函数中的“后端”部分感到烦恼。
我做错了什么或者我错过了其他一些重要的部分?恕我直言,这个规范不应该通过(用Gandalf的意思)。
我正在使用Rails 4.2.6,Rspec-Rails 3.4.2
更新
Max指出,这可能不是Rspec问题,而是Rails自动加载。
但我尝试输入
Backend::HomeController
在Rails控制台中,但我得到了预期的错误
NameError: uninitialized constant Backend::HomeController
而according to the Rails guide,控制台和测试套件都自动加载。不过我觉得我在这里正确。
答案 0 :(得分:2)
之前我遇到过同样的问题 - 你可以在这里阅读整个问题:
Object.const_get and Rails - cutting off parent module names
但问答的答案来自用户Apneadiving的this回答:
请注意Rails开发模式中存在恶意案例。为了获得速度,加载严格的最小值。然后Rails在需要时查找类定义。
但是,当您说
::User
已经加载,然后查找::Admin::User
时,这有时会失败。 Rails不会寻找它,它会认为::User
可以解决问题。这可以使用代码中的
require_dependency
语句来解决。