class RSpec::Mocks::StubChain

@private

Attributes

block[R]
chain[R]
object[R]

Public Class Methods

new(object, *chain, &blk) click to toggle source
# File lib/rspec/mocks/stub_chain.rb, line 11
def initialize(object, *chain, &blk)
  @object = object
  @chain, @block = format_chain(*chain, &blk)
end
stub_chain_on(object, *chain, &blk) click to toggle source
# File lib/rspec/mocks/stub_chain.rb, line 5
def self.stub_chain_on(object, *chain, &blk)
  new(object, *chain, &blk).stub_chain
end

Public Instance Methods

stub_chain() click to toggle source
# File lib/rspec/mocks/stub_chain.rb, line 16
def stub_chain
  if chain.length > 1
    if matching_stub = find_matching_stub
      chain.shift
      matching_stub.invoke(nil).stub_chain(*chain, &block)
    else
      next_in_chain = Mock.new
      object.stub(chain.shift) { next_in_chain }
      StubChain.stub_chain_on(next_in_chain, *chain, &block)
    end
  else
    object.stub(chain.shift, &block)
  end
end

Private Instance Methods

find_matching_stub() click to toggle source
# File lib/rspec/mocks/stub_chain.rb, line 44
def find_matching_stub
  ::RSpec::Mocks.proxy_for(object).
    __send__(:find_matching_method_stub, chain.first.to_sym)
end
format_chain(*chain, &blk) click to toggle source
# File lib/rspec/mocks/stub_chain.rb, line 33
def format_chain(*chain, &blk)
  if Hash === chain.last
    hash = chain.pop
    hash.each do |k,v|
      chain << k
      blk = lambda { v }
    end
  end
  return chain.join('.').split('.'), blk
end