2

rspecとrspec-mocksをインストールしたばかりですが、最も簡単なセットアップを実行できません

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>'

何が間違っているのだろうか、他の宝石をロードする必要がありますか?

4

2 に答える 2

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

'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)

さて、これには免責事項があります。これはハックであり、この変更を行うことの意味を完全には理解していません. うまくいけば、それが役に立ち、実行可能な回避策になります。

于 2013-03-08T20:30:41.587 に答える