Ошибка Rspec с load_missing_constant, когда классы живут в подкаталогах и подклассы

У меня возникли проблемы с запуском тестов RSpec из-за того, что, как я подозреваю, связано с автозагрузкой. Вот ошибка:

/usr/share/ruby-rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.4/lib/active_support/dependencies.rb:490:in `load_missing_constant': Expected /var/lib/jenkins/.../portfolios/base_manage_controller.rb to define Portfolios::BaseManageController (LoadError)
from /usr/share/ruby-rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.4/lib/active_support/dependencies.rb:181:in `block in const_missing'
from /usr/share/ruby-rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.4/lib/active_support/dependencies.rb:179:in `each'
from /usr/share/ruby-rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.1.4/lib/active_support/dependencies.rb:179:in `const_missing'
from /usr/share/ruby-rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/ext/module.rb:36:in `const_missing'
from /var/lib/jenkins/jobs/.../app/controllers/portfolios/customize_controller.rb:1:in `<top (required)>'

Вот заголовок файла:

class Portfolios::BaseManageController < ApplicationController

И он живет в app/controllers/portfolios/base_manage_controller.rb

И его подкласс:

class Portfolios::CustomizeController < Portfolios::BaseManageController

И он живет в app/controllers/portfolios/customize_controller.rb

Наконец, вот куча автозагрузок:

config.autoload_paths += Dir["#{config.root}/lib",  "#{config.root}/lib/**/"]
config.autoload_paths += %W(#{config.root}/app/models/statistics)

#Any test/dev specific load paths
if not Rails.env.production?
  config.autoload_paths += %W(#{config.root}/spec/support)
  config.autoload_paths += %W(#{config.root}/spec/support/builders)
  config.autoload_paths += %W(#{config.root}/spec/support/modules)
  config.autoload_paths += %W(#{config.root}/spec/support/utils)
end

Любая помощь будет очень признательна!

Ответ 1

Эта ошибка иногда возникает, когда возникает исключение, возникающее при определении класса. В этом случае может возникнуть ошибка времени выполнения при попытке определить класс, найденный в base_manage_controller.rb.

Чтобы убедиться в этом, попробуйте удалить все из base_manage_controller.rb, за исключением объявления класса:

class Portfolios::BaseManageController < ApplicationController
end

Это должно привести к запуску спецификаций, но сбой.

Чтобы найти ошибку времени выполнения, верните все в класс и загрузите ее из script/console, вызвав Portfolios::BaseManageController. Это попытается динамически загрузить класс и повысить исключение, которое предотвращает определение вашего класса.

Ответ 2

Похоже, что Portfolios не определяется, когда rspec загружается Portfolios::BaseManageController. Где вы определили Portfolios? Если он определен как модуль или класс где-то в отдельном файле, вам нужно сначала require этот файл.

Ответ 3

есть столкновение в вашем пути автозагрузки из-за существования файла с тем же именем в /var/lib/jenkins/.../portfolios/base_manage_controller.rb

Вам нужно либо изменить путь загрузки, чтобы приложение/контроллеры появились раньше в списке, либо файл, указанный на указанном выше пути, должен быть переименован или удален.

Ответ 4

Следующее решение поможет вам

создать спецификацию в следующем пути для приложений/контроллеров/портфелей/base_manage_controller.rb спецификации/контроллеры/портфели/base_manage_controller_spec.rb

Содержимое спецификации должно быть таким:

describe Portfolios::BaseManageController do
 -----
end

Вы можете применить ту же логику для приложений/контроллеров/портфелей/customize_controller.rb