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

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec/mocks/any_instance/proxy.rb

Overview

The `AnyInstance::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 propogates 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.

Instance Method Summary (collapse)

Constructor Details

- (Proxy) initialize(recorder, target_proxies)



22
23
24
25
# File 'lib/rspec/mocks/any_instance/proxy.rb', line 22

def initialize(recorder, target_proxies)
  @recorder       = recorder
  @target_proxies = target_proxies
end

Instance Method Details

- (Object) expect_chain(*chain, &block)



55
56
57
58
59
# File '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

- (Object) klass



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

def klass
  @recorder.klass
end

- (Object) should_not_receive(method_name, &block)



67
68
69
70
71
# File 'lib/rspec/mocks/any_instance/proxy.rb', line 67

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

- (Object) should_receive(method_name, &block)



61
62
63
64
65
# File 'lib/rspec/mocks/any_instance/proxy.rb', line 61

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

- (Object) stub(method_name_or_method_map, &block)



31
32
33
34
35
36
37
38
39
40
41
# File '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

- (Object) stub_chain(*chain, &block)



49
50
51
52
53
# File '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

- (Object) unstub(method_name)



43
44
45
46
47
# File '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