代码之家  ›  专栏  ›  技术社区  ›  user2490003

宝石的RSpec自动加载行为

  •  1
  • user2490003  · 技术社区  · 6 年前

    我有一个配置了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”的嵌套类。直接。(使用它的人会 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 语句试图加载 阿尔法rb 这反过来又需要 福。rb 这是错误的

    foo.rb:1:in `<top (required)>': Foo is not a class (TypeError)
    

    根据 this thread ,当类( )已经定义了。

    这是怎么发生的?RSpec是否试图在幕后施展魔法并加载我的库?我该怎么解决这个问题?

    编辑 :我还删除了 --require spec_helper 我妈妈的台词 .rspec 所以只有在我运行测试时才能手动加载。

    0 回复  |  直到 6 年前