2013-03-07 39 views
2

我剛安裝的RSpec和RSpec,嘲笑,但我不能夠運行最簡單的設置Rspec的/嘲笑引發初始化常數BasicObject :: RSpec的

irb(main):001:0> require 'rspec' 
=> true 
irb(main):004:0> require 'rspec/mocks' 
=> false 
irb(main):006:0> RSpec::Mocks::setup(Object.new) 
NameError: uninitialized constant BasicObject::RSpec 
    from /usr/local/Cellar/ruby/1.9.1-p376/lib/ruby/gems/1.9.1/gems/rspec-mocks-2.13.0/lib/rspec/mocks.rb:60:in `block in add_extensions' 
    from /usr/local/Cellar/ruby/1.9.1-p376/lib/ruby/gems/1.9.1/gems/rspec-mocks-2.13.0/lib/rspec/mocks.rb:60:in `class_eval' 
    from /usr/local/Cellar/ruby/1.9.1-p376/lib/ruby/gems/1.9.1/gems/rspec-mocks-2.13.0/lib/rspec/mocks.rb:60:in `add_extensions' 
    from /usr/local/Cellar/ruby/1.9.1-p376/lib/ruby/gems/1.9.1/gems/rspec-mocks-2.13.0/lib/rspec/mocks.rb:11:in `setup' 
    from (irb):6 
    from /usr/local/Cellar/ruby/1.9.1-p376/bin/irb:12:in `<main>' 

我不知道什麼可能是錯誤的,我需要加載一些其他的寶石?

+0

你嘗試過'需要」/RSpec的/ mock'' – BlackHatSamurai 2013-03-07 22:01:53

+0

@Blaine './rspec/mock'或'./rspec/mocks'不起作用 - LoadError:沒有這樣的文件加載 - ./rspec/mocks – 2013-03-07 22:42:22

+1

不知道什麼問題,但我能夠重現錯誤通過安裝Ruby 1.9.1-p376來查看。你有機會得到更高版本的Ruby嗎?我的測試1.9.2和1.9.3似乎工作正常。另外,我鼓勵你看看RVM:https://rvm.io/rvm/install/ – 2013-03-08 08:44:17

回答

0

如果您遇到了Ruby 1.9.1,我想我已經爲您提供了一個解決方案,但一個警告 - 這有點破解!

如果你看看你的錯誤信息,它說失敗是在/lib/rspec/mocks.rb的第60行。所以,讓我們來看看:https://github.com/rspec/rspec-mocks/blob/v2.13.0/lib/rspec/mocks.rb

def add_extensions 
    method_host.class_eval { include RSpec::Mocks::Methods } # (line 60) 
    Class.class_eval { include RSpec::Mocks::AnyInstance } 
    $_rspec_mocks_extensions_added = true 
end 

注意,這個私有方法的第一行(第60行)呼籲「method_host」。所以,讓我們來看看下幾行的私有方法「method_host」:

def method_host 
    # On 1.8.7, Object.ancestors.last == Kernel but 
    # things blow up if we include `RSpec::Mocks::Methods` 
    # into Kernel...not sure why. 
    return Object unless defined?(::BasicObject) 

    # MacRuby has BasicObject but it's not the root class. 
    return Object unless Object.ancestors.last == ::BasicObject 

    ::BasicObject 
end 

你可以看到,有幾個條件它有時會返回「對象」,否則返回「BasicObject」。所以,這讓我懷疑我們是否不能添加自己的條件。

return Object unless defined?(::BasicObject::RSpec) 

我們可以通過創建一個文件來測試這一點,讓我們稱之爲它mocks_hack.rb,我們將重新定義「method_host」,包括我們的狀況。

module RSpec 
    module Mocks 
    class << self 

    private 

     def method_host 
     # On 1.8.7, Object.ancestors.last == Kernel but 
     # things blow up if we include `RSpec::Mocks::Methods` 
     # into Kernel...not sure why. 
     return Object unless defined?(::BasicObject) 

     # MacRuby has BasicObject but it's not the root class. 
     return Object unless Object.ancestors.last == ::BasicObject 

     # Jon's hack for Anurag Uniyal 
     return Object unless defined?(::BasicObject::RSpec) 

     ::BasicObject 
     end 
    end 
    end 
end 

從mocks_hack.rb的當前目錄啓動irb,下面的代碼應該'工作'。

require 'rspec' 
require './mocks_hack' 
RSpec::Mocks::setup(Object.new) 

現在,這一帶有一個聲明 - 這是一個黑客,我不完全理解使得這種變化的影響可能是什麼。希望它有幫助,並且是一種可行的解決方法。

1

Jonathan在正確的軌道上,但問題的根源是與1.8.7不兼容,因爲:: BasicObject仍然存在於Ruby 1.9中。

妥善解決什麼是筆者修補更宜由補丁限制到Ruby 1.8規定:

def method_host 
    # On 1.8.7, Object.ancestors.last == Kernel but 
    # things blow up if we include `RSpec::Mocks::Methods` 
    # into Kernel...not sure why. 
    return Object unless defined?(::BasicObject) && RUBY_VERSION =~ /^1\.8\.\d+/ 

    # MacRuby has BasicObject but it's not the root class. 
    return Object unless Object.ancestors.last == ::BasicObject 

    ::BasicObject 
end 
相關問題