Jac*_*tad 5 ruby rspec ruby-on-rails rspec-rails
当存在具有相同名称的全局控制器时,为命名空间控制器创建控制器规范时,我有一个奇怪的问题.
控制器名称是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
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的导向,控制台和测试套件自动加载.但是我觉得我在这里正确.
我以前也遇到过同样的问题 - 你可以在这里阅读整个问题:
Object.const_get 和 Rails - 切断父模块名称
但答案的核心来自用户 Apneadiving 的这个答案:
请注意,Rails 开发模式中存在恶性案例。为了获得速度,加载严格的最小值。然后,Rails 在需要时查找类定义。
但是这有时会失败,例如,当您说
::User已经加载,然后查找::Admin::User. Rails 不会寻找它,它会认为::User可以解决问题。这可以使用
require_dependency代码中的语句来解决。
| 归档时间: |
|
| 查看次数: |
771 次 |
| 最近记录: |