Rspec 命名空间控制器上的控制器规范找到具有相同名称的全局控制器
Rspec controller spec on namespaced controller finds the global controller with same name
当还有一个同名的全局控制器时,我在为命名空间控制器创建控制器规范时遇到了一个奇怪的问题。
控制器名称是 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
函数中的 "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.
当还有一个同名的全局控制器时,我在为命名空间控制器创建控制器规范时遇到了一个奇怪的问题。
控制器名称是 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
函数中的 "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,控制台和测试套件都会自动加载。不过我认为我走在正确的轨道上。
我以前遇到过同样的问题 - 您可以在这里阅读整个问题:
但答案的核心来自
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.