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

Rspec controller spec on namespaced controller finds the global controller with same name

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

控制器名称是 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 函数中的 "Backend" 部分。

我是做错了什么还是漏掉了其他重要部分?恕我直言,这个规范不应该通过(用 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,控制台和测试套件都会自动加载。不过我认为我走在正确的轨道上。

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

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

Be aware that there are vicious cases in Rails development mode. In order to gain speed, the strict minimum is loaded. Then Rails looks for classes definitions when needed.

But this sometimes fails big time example, when you have say ::User already loaded, and then look for ::Admin::User. Rails would not look for it, it will think ::User does the trick.

This can be solved using require_dependency statements in your code.