ruby - 陷入 rvm hell 试图让一个简单的 rspec 运行

标签 ruby rspec rvm testunit

来自终端的 Ruby 设置

 % ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux]
=> ~/ruby/grounded/test
 % where ruby
/home/mike/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
/home/mike/.rvm/bin/ruby
/usr/local/bin/ruby
/usr/bin/ruby
=> ~/ruby/grounded/Person/test
 % which ruby
/home/mike/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
% rvm current
ruby-1.9.2-p180

目录结构

 % tree
.
├── bowling.rb
└── bowling_spec.rb

文件内容

保龄球.rb

class Bowling

end

bowling_spec.rb

require 'rubygems'
require 'rspec'
require 'bowling'
describe Bowling, "#score" do
  it "returns 0 for all gutter game" do
    bowling = Bowling.new
    20.times { bowling.hit(0) }
    bowling.score.should eq(0)
  end
end

% ruby bowling_spec.rb

/home/mike/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': no such file to load -- bowling (LoadError)
    from /home/mike/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from bowling_spec.rb:3:in `<main>'

问题

  • 为什么在 bowling.rbbowling_spec.rb 时出现 LoadError 在同一个文件夹中?
  • 在错误中 .../site_ruby/1.9.1/... 当我运行 ruby​​ 1.9.2 那么为什么 1.9.1 甚至出现?
  • 我如何克服这个障碍并开始享受 ruby​​ 带来的乐趣。

最佳答案

当需要文件时,文件必须位于名为 $LOAD_PATH 的目录列表中。当前目录曾经在此列表中,但从 1.9.2 开始,出于安全原因已将其删除。

你有四个选项(按照我认为它们的好坏顺序排列)

1 将您的目录结构更改为如下所示

.
|-- lib
|   `-- bowling.rb
`-- spec
    `-- bowling_spec.rb

然后作为 rspec spec 而不是 ruby bowling_spec.rb 运行 这是可行的,因为 RSpec 会看到 lib 在您的当前目录中,然后为您将其添加到 $LOAD_PATH。

如果这样做,您也不必 require 'rspec'

2 使用 ruby -I 运行。 bowling_spec.rb

这会将当前目录添加到 $LOAD_PATH

3 使用 require_relative 'bowling' 而不是 require 'bowling'

这将查找相对于当前正在运行的文件 (bowling_spec.rb) 的 bowling.rb 文件

4 使用 require('../bowling', __FILE__) 而不是 require 'bowling'

这个和上面的基本一样

其他问题:

问:当 bowling.rb 和 bowling_spec.rb 在同一文件夹中时,为什么我会收到 LoadError?

答:因为当前目录(您运行脚本的目录,而不是文件所在的目录)不在 $LOAD_PATH 中。

问: 在错误中到底是什么.../site_ruby/1.9.1/... 当我运行 ruby​​ 1.9.2 那么为什么 1.9.1 甚至会出现?

答:嗯。不确定我是否记得准确,但是 IIRC,它们非常相似以至于界面没有改变,所以从系统的角度来看它们可以与 1.9.1 兼容。

问:我如何克服这个障碍并开始享受 ruby​​ 带来的乐趣。

答:我想这要视情况而定。如果问题是您希望能够运行 CWD 中的文件,那么您可以将环境变量 RUBYLIB 添加到 . 到您的 .bash_profile(或您系统上的任何等效项)这将告诉 Ruby 在当前目录中查找文件。但是,这很容易出现错误(并且可能导致无意中执行 Ruby 文件,这是一种安全风险)。如果您只是指“我如何开始学习”或什么是有趣的项目?然后查看我的一个项目,Ruby Kickstart在六节课中,您将了解 Ruby 的很大一部分,并在结束时让您编写和部署一个简单的 Web 应用程序。

关于ruby - 陷入 rvm hell 试图让一个简单的 rspec 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798219/

相关文章:

ruby - ruby 和 activerecord 中的 AES 解密

ruby-on-rails - 尝试通过 rspec 测试失败

ruby-on-rails - 如何让 Rails 与 AngularJS 协同工作

ruby-on-rails - 未知验证器 : 'LenghtValidator' (ArgumentError) when I run RSpec

ruby-on-rails - 是否值得测试诸如范围之类的低级代码?

ruby-on-rails - 当切换到Rails文件夹时,rvm是否选择ruby和gemset?

ruby-on-rails - 您如何在 Sidekiq 中重新安排工作?

ruby-on-rails - 如何使用 Rspec 测试 google analytics (garb) API?

ruby - RVM 导致 Ruby 1.9.2 上安装的 gem 出现路径问题 - 无法注释等,我是否需要重新安装 RVM?

ruby-on-rails - RVM 和 rbenv 实际上是如何工作的?