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

Jac*_*tad 5 ruby rspec ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

但是,如果我将全局中的名称更改为其他名称HomeController,例如NotMyHomeController测试失败并显示错误

Unable to autoload constant HomeController, expected app/controllers/home_controller.rb to define it
Run Code Online (Sandbox Code Playgroud)

这让我怀疑Rspec不会打扰Rspec.describe函数中的"Backend"部分.

我做错了什么还是我错过了其他一些重要的部分?恕我直言,这个规范不应该通过(用Gandalf的话来说).

我正在使用Rails 4.2.6,Rspec-Rails 3.4.2

更新

正如Max指出的那样,这可能不是Rspec问题,而是Rails自动加载.

但是我试着打字

Backend::HomeController
Run Code Online (Sandbox Code Playgroud)

在Rails控制台中,但我得到了预期的错误

NameError: uninitialized constant Backend::HomeController
Run Code Online (Sandbox Code Playgroud)

根据Rails的导向,控制台和测试套件自动加载.但是我觉得我在这里正确.

dax*_*dax 4

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

Object.const_get 和 Rails - 切断父模块名称

但答案的核心来自用户 Apneadiving 的这个答案:

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

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

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