Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 命名空间控制器上的Rspec控制器规范查找具有相同名称的全局控制器_Ruby On Rails_Ruby_Rspec_Rspec Rails - Fatal编程技术网

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
,解决了这个问题