Ошибка 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