Class: RSpec::Mocks::AnyInstance::Proxy Private
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
- .new(recorder, target_proxies) ⇒ Proxy constructor Internal use only
Instance Method Summary
- #expect_chain(*chain, &block) Internal use only
- #klass Internal use only
- #should_not_receive(method_name, &block) Internal use only
- #should_receive(method_name, &block) Internal use only
- #stub(method_name_or_method_map, &block) Internal use only
- #stub_chain(*chain, &block) Internal use only
- #unstub(method_name) Internal use only
- #perform_proxying(method_name, args, block, &target_proxy_block) private Internal use only
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) (__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 (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) (__method__, [method_name], block) do |proxy| proxy. (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) (__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 (__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) (__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) (__method__, [method_name], nil) do |proxy| proxy.remove_stub_if_present(method_name) end end