我有一个配置了rspec的gem项目。我的文件夹结构看起来像这样-
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)
根据this thread,当已经定义一个类(Foo
)时,RSpec会引发这种类型的错误。
这是怎么回事? RSpec是否尝试在后台做一些魔术并加载我的库?我该如何解决?
编辑:我还从--require spec_helper
文件中删除了.rspec
行,因此在运行测试时仅手动加载了该文件。