Ruby on rails 命名空间控制器上的Rspec控制器规范查找具有相同名称的全局控制器
当有一个同名的全局控制器时,为一个有名称空间的控制器创建控制器规范时,我遇到了一个奇怪的问题 控制器名称为Ruby on rails 命名空间控制器上的Rspec控制器规范查找具有相同名称的全局控制器,ruby-on-rails,ruby,rspec,rspec-rails,Ruby On Rails,Ruby,Rspec,Rspec Rails,当有一个同名的全局控制器时,为一个有名称空间的控制器创建控制器规范时,我遇到了一个奇怪的问题 控制器名称为HomeController和Backend::HomeController 请注意,我尚未创建文件app/controllers/backend/home\u controller.rb,只有全局控制器存在app/controllers/home\u controller.rb 因此,我预计测试会出现错误,但事实并非如此。它过去了,绿色的,快乐的 我的规格是这样的 #spec/contro
HomeController
和Backend::HomeController
请注意,我尚未创建文件app/controllers/backend/home\u controller.rb
,只有全局控制器存在app/controllers/home\u 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.description
函数中的“后端”部分
我是做错了什么,还是错过了其他重要的部分?嗯,这个规范不应该通过(套用甘道夫的话)
我使用的是Rails 4.2.6,Rspec Rails 3.4.2
更新
正如Max指出的,这可能不是Rspec的问题,而是Rails自动加载的问题
但是我试着只是打字
Backend::HomeController
在Rails控制台中,但是在那里我得到了预期的错误
NameError: uninitialized constant Backend::HomeController
而且,控制台和测试套件都自动加载。然而,我认为我在这方面是正确的。我以前也遇到过同样的问题-你可以在这里了解整个问题: 但答案的实质来自用户的回答: 请注意,Rails开发模式中存在恶性案例。为了获得速度,加载严格的最小值。然后Rails在需要时查找类定义 但这有时会失败,例如,当您说已经加载了
::User
,然后查找::Admin::User
。Rails不会寻找它,它会认为::User
就是这样做的
这可以通过在代码中使用require\u dependency
语句来解决
我猜是Rails自动加载器做了一些不正常的事情-它通过monkeypatching
Object.const_missing
工作,这通常会引发NameError:uninitialized constant Backend::HomeController
。这和RSpec没什么关系。谢谢你帮我澄清这一点。您对如何进一步研究Rails自动加载器有什么建议吗?如果您将其定义为绝对而非相对,您可能希望尝试看看会发生什么:RSpec.description::Backend::HomeController
谢谢您的提示,不幸的是,使用绝对名称没有帮助,如果我更改全局家庭控制器的名称,仍然会出现相同的问题和错误消息谢谢!我最终在规范的顶部添加了require_dependency“#{::Rails.root}/app/controllers/backend/home_controller
,解决了这个问题