15

我正在尝试将我的 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
...

库看起来像这样:

# 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 无法找到 lib。

4

4 回答 4

25

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'
于 2012-07-07T16:39:42.597 回答
6

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

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

于 2013-01-26T20:12:18.347 回答
4

如果您的规范已定位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 应该为您加载所有这些路径。

于 2012-07-07T17:26:57.450 回答
1

尝试手动定义路径

$LOAD_PATH << './lib/services/'

然后像这样添加库

require 'my_lib.rb'
于 2012-07-07T16:45:18.217 回答