在RSpec中需要lib,Ruby 1.9.2带来“没有这样的文件加载”

时间:2012-07-07 16:24:16

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

我正在尝试将我的一个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无法找到lib。

4 个答案:

答案 0 :(得分:24)

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'

答案 1 :(得分:6)

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

因此,您只需在规范文件中使用require 'services/my_lib'

答案 2 :(得分: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应该为您加载所有这些路径。

答案 3 :(得分:0)

尝试手动定义路径

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

然后像这样添加库

require 'my_lib.rb'