命名空间控制器上的Rspec控制器规范找到具有相同名称的全局控制器

时间:2016-03-30 21:14:25

标签: ruby-on-rails ruby rspec rspec-rails

当还有一个名称相同的全局控制器时,为命名空间控制器创建控制器规范时,我遇到了一个奇怪的问题。

控制器名称为HomeControllerBackend::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,控制台和测试套件都自动加载。不过我觉得我在这里正确。

1 个答案:

答案 0 :(得分:2)

之前我遇到过同样的问题 - 你可以在这里阅读整个问题:

Object.const_get and Rails - cutting off parent module names

但问答的答案来自用户Apneadiving的this回答:

  

请注意Rails开发模式中存在恶意案例。为了获得速度,加载严格的最小值。然后Rails在需要时查找类定义。

     

但是,当您说::User已经加载,然后查找::Admin::User时,这有时会失败。 Rails不会寻找它,它会认为::User可以解决问题。

     

这可以使用代码中的require_dependency语句来解决。