【问题标题】:require lib in RSpec with Ruby 1.9.2 brings "no such file to load"Ruby 1.9.2 的 RSpec 中的 require lib 带来“没有要加载的文件”
【发布时间】:2012-07-07 18:27:50
【问题描述】:

我正在尝试将我的一个 Rails 项目升级到Ruby 1.9.2。一切进展顺利,但一项 RSpec 测试失败了。在这个测试中我require 一个Ruby lib

# file spec/models/my_lib_spec.rb
require 'spec_helper'
require 'lib/services/my_lib'

describe "MyLib" do

  it "should do something" do
...

lib 如下所示:

# file lib/services/my_lib.rb
class MyLib

  def self.do_something
  ...

在 Ruby 1.8.7 (REE) 中,测试运行良好:

$ ruby -v   
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin11.1.0], MBARI 0x6770, Ruby
Enterprise Edition 2011.03
$ rspec ./spec/models/my_lib_spec.rb
..

Finished in 1.4 seconds
2 examples, 0 failures

在 Ruby 1.9.2 中,我收到错误 no such file to load

$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.1.0]
$ rspec ./spec/models/my_lib_spec.rb
/Users/tmangner/.rvm/gems/ruby-1.9.2-p290@madgoal/gems/activesupport-
3.2.2/lib/active_support/dependencies.rb:251:in `require': no such file
to load -- lib/services/my_lib (LoadError)

我不知道是什么让 Ruby 1.9 无法找到库。

【问题讨论】:

    标签: ruby-on-rails ruby rspec require ruby-1.9


    【解决方案1】:

    ruby 1.9 中的加载路径与 1.8 中的加载路径不同。

    您需要将项目的根目录添加到您的加载路径中。

    您可以通过像这样运行 rspec 来做到这一点:

    rspec -I . ./spec/models/tipp_remember_spec.rb
    

    ...或通过手动将内容添加到 spec_helper.rb 中的加载路径(将其放在 spec_helper.rb 的顶部

    $:<< File.join(File.dirname(__FILE__), '..')
    

    我认为默认情况下 rspec 也会将您的本地 lib 目录添加到加载路径,因此您可以改写如下 require 行:

    require 'services/my_lib'
    

    【讨论】:

    • 答案的最后一部分是关键! "require 'service/my_lib'" 适用于 Ruby1.9 Ruby1.8。显然,RSpec 确实在 $LOAD_PATH 中包含了“lib”。
    • 太棒了! rspec - I . 是我将 ruby​​ 从 1.8 升级到 1.9 的关键。非常感谢@Frost!
    • 如果不想在每次运行rspec时都指定-I .,可以将其添加到.rspec文件中,默认情况下会添加。
    【解决方案2】:

    在 RSpec 2.x 中,lib 目录会自动添加到加载路径(请参阅RSpec-Core#get_started)。

    所以你可以在你的规范文件中使用require 'services/my_lib'

    【讨论】:

    • 我在任何地方都看不到the lib directory is automatically added to the load path,但这是真的
    • @为什么我修复了断开的链接。看起来它没有在那里明确说明,但该示例确实显示它隐式使用。我会努力解决这个问题。
    • 对于 RSpec 3.5(最新),链接是 here
    【解决方案3】:

    如果您的规范位于 spec/models/my_lib_spec.rb 并且您想测试 lib/services/my_lib.rb,那么只需告诉规范如何访问 lib 文件

    require 'spec_helper'
    require_relative '../../lib/services/my_lib'
    
    describe "MyLib" do
    
      it "should do something" do
    

    最后说明:由于您包含了 spec_helper,因此您通常不必提供所有依赖项的路径,因为 Rails 应该为您加载所有这些。

    【讨论】:

      【解决方案4】:

      尝试手动定义路径

      $LOAD_PATH &lt;&lt; './lib/services/'

      然后像这样添加库

      require 'my_lib.rb'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 2016-05-09
        相关资源
        最近更新 更多