У меня есть проект gem с настроенным rspec. Моя структура папок выглядит так -
lib/
- foo/
- foo.rb
- alpha.rb
spec/
- spec_helper.rb
integration/
- alpha_spec.rb
Файлы foo.rb
и alpha.rb
имеют следующие структуры в терминах определений классов.
# lib/foo/foo.rb
class Foo
# do stuff
end
и
# lib/foo/alpha.rb
require_relative 'foo'
class Foo
class Alpha
# do stuff
end
end
Основной вывод здесь заключается в том, что Alpha
- это вложенный класс, который напрямую требует 'foo.rb'. (Кто-то, кто использовал бы это, require foo/alpha
из их сценария)
Мой spec_helper.rb
файл просто требует моей библиотеки, загрузив foo/alpha
-
# spec/spec_helper.rb
# Check if `Foo` class is already defined
Object.const_defined?('Foo') ? puts "IS DEFINED" : "IS NOT DEFINED"
require 'foo/alpha'
К моему удивлению, константа Foo
уже была загружена еще до того, как потребовалось alpha/foo
, так как вывод вернул IS DEFINED
.
Из-за этого мой оператор require
пытается загрузить alpha.rb
, что, в свою очередь, требует foo.rb
, и с ошибками
foo.rb:1:in `<top (required)>': Foo is not a class (TypeError)
Согласно этого потока , этот тип ошибки вызывается RSpec, когда класс (Foo
) уже определен.
Как это происходит? RSpec пытается замаскировать и загрузить мою библиотеку? Как мне обойти это?
EDIT : я также удалил строку --require spec_helper
из моего файла .rspec
, поэтому он загружается только вручную, когда я запускаю тест.