RSpec对宝石的自动加载行为

时间:2018-08-30 17:53:36

标签: ruby rspec autoloader

我有一个配置了rspec的gem项目。我的文件夹结构看起来像这样-

lib/
  - foo/
    - foo.rb
    - alpha.rb

spec/
  - spec_helper.rb
  integration/
    - alpha_spec.rb

文件foo.rbalpha.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)

根据this thread,当已经定义一个类(Foo)时,RSpec会引发这种类型的错误。

这是怎么回事? RSpec是否尝试在后台做一些魔术并加载我的库?我该如何解决?

编辑:我还从--require spec_helper文件中删除了.rspec行,因此在运行测试时仅手动加载了该文件。

0 个答案:

没有答案