Режим автозагрузки RSpec для драгоценных камней - PullRequest
0 голосов
/ 30 августа 2018

У меня есть проект 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, поэтому он загружается только вручную, когда я запускаю тест.

...