2013-03-07 3 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

+0

@Blaine «./rspec/mock» или»./rspec/mocks' не работает - LoadError: нет такого файла для загрузки - ./rspec/mocks –

+1

не уверен, что проблема, но я был в состоянии воспроизвести ошибку вам «Посмотрите, установив Ruby 1.9.1-p376. Вы можете получить более позднюю версию Ruby? Мое тестирование с 1.9.2 и 1.9.3 работает нормально. Как хорошо, я бы посоветовал вам взглянуть на РВМ: https://rvm.io/rvm/install/ –

ответ

0

Если вы застряли с Руби 1.9.1, я думаю, что у меня есть для вас решение, но предупреждение - это немного рубить!

Если вы посмотрите на сообщение об ошибке, он говорит, что отказ от линии 60 /lib/rspec/mocks.rb. Итак, давайте посмотрим на: 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 

Вы можете видеть, что есть несколько условий, при которых он иногда возвращает «Object» и «иначе 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

Джонатан находится на правильном пути, но корень проблемы несовместимости с 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 
Смежные вопросы