123456789_123456789_123456789_123456789_123456789_

Class: RSpec::Mocks::AnyInstance::Proxy Private

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb

Overview

The Recorder is responsible for redefining the klass’s instance method in order to add any stubs/expectations the first time the method is called. It’s not capable of updating a stub on an instance that’s already been previously stubbed (either directly, or via any_instance).

This proxy sits in front of the recorder and delegates both to it and to the ::RSpec::Mocks::Proxy for each already mocked or stubbed instance of the class, in order to propagates changes to the instances.

Note that unlike ::RSpec::Mocks::Proxy, this proxy class is stateless and is not persisted in RSpec::Mocks.space.

Proxying for the message expectation fluent interface (typically chained off of the return value of one of these methods) is provided by the FluentInterfaceProxy class below.

Class Method Summary

Instance Method Summary

Instance Method Details

#expect_chain(*chain, &block)

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb', line 55

def expect_chain(*chain, &block)
  perform_proxying(__method__, chain, block) do |proxy|
    Mocks::ExpectChain.expect_chain_on(proxy.object, *chain, &block)
  end
end

#klass

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb', line 27

def klass
  @recorder.klass
end

#perform_proxying(method_name, args, block, &target_proxy_block) (private)

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb', line 79

def perform_proxying(method_name, args, block, &target_proxy_block)
  recorder_value = @recorder.__send__(method_name, *args, &block)
  proxy_values   = @target_proxies.map(&target_proxy_block)
  FluentInterfaceProxy.new([recorder_value] + proxy_values)
end

#should_not_receive(method_name, &block)

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb', line 71

def should_not_receive(method_name, &block)
  perform_proxying(__method__, [method_name], block) do |proxy|
    proxy.add_message_expectation(method_name, &block).never
  end
end

#should_receive(method_name, &block)

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb', line 61

def should_receive(method_name, &block)
  perform_proxying(__method__, [method_name], block) do |proxy|
    # Yeah, this is a bit odd...but if we used `add_message_expectation`
    # then it would act like `expect_every_instance_of(klass).to receive`.
    # The any_instance recorder takes care of validating that an instance
    # received the message.
    proxy.add_stub(method_name, &block)
  end
end

#stub(method_name_or_method_map, &block)

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb', line 31

def stub(method_name_or_method_map, &block)
  if Hash === method_name_or_method_map
    method_name_or_method_map.each do |method_name, return_value|
      stub(method_name).and_return(return_value)
    end
  else
    perform_proxying(__method__, [method_name_or_method_map], block) do |proxy|
      proxy.add_stub(method_name_or_method_map, &block)
    end
  end
end

#stub_chain(*chain, &block)

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb', line 49

def stub_chain(*chain, &block)
  perform_proxying(__method__, chain, block) do |proxy|
    Mocks::StubChain.stub_chain_on(proxy.object, *chain, &block)
  end
end

#unstub(method_name)

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb', line 43

def unstub(method_name)
  perform_proxying(__method__, [method_name], nil) do |proxy|
    proxy.remove_stub_if_present(method_name)
  end
end