class RSpec::Mocks::Proxy
@private
Attributes
object[R]
@private
Public Class Methods
new(object, name=nil, options={})
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 7 def initialize(object, name=nil, options={}) @object = object @name = name @error_generator = ErrorGenerator.new object, name, options @expectation_ordering = RSpec::Mocks::space.expectation_ordering @messages_received = [] @options = options @already_proxied_respond_to = false @null_object = false end
Public Instance Methods
add_message_expectation(location, method_name, opts={}, &block)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 45 def add_message_expectation(location, method_name, opts={}, &block) meth_double = method_double[method_name] if null_object? && !block meth_double.add_default_stub(@error_generator, @expectation_ordering, location, opts) do @object end end meth_double.add_expectation @error_generator, @expectation_ordering, location, opts, &block end
add_stub(location, method_name, opts={}, &implementation)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 97 def add_stub(location, method_name, opts={}, &implementation) method_double[method_name].add_stub @error_generator, @expectation_ordering, location, opts, &implementation end
already_proxied_respond_to()
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 35 def already_proxied_respond_to @already_proxied_respond_to = true end
already_proxied_respond_to?()
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 40 def already_proxied_respond_to? @already_proxied_respond_to end
as_null_object()
click to toggle source
@private Tells the object to ignore any messages that aren't explicitly set as stubs or message expectations.
# File lib/rspec/mocks/proxy.rb, line 29 def as_null_object @null_object = true @object end
build_expectation(method_name)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 58 def build_expectation(method_name) meth_double = method_double[method_name] meth_double.build_expectation( @error_generator, @expectation_ordering ) end
check_for_unexpected_arguments(expectation)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 88 def check_for_unexpected_arguments(expectation) @messages_received.each do |(method_name, args, _)| if expectation.matches_name_but_not_args(method_name, *args) raise_unexpected_message_args_error(expectation, *args) end end end
has_negative_expectation?(message)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 129 def has_negative_expectation?(message) method_double[message].expectations.detect {|expectation| expectation.negative_expectation_for?(message)} end
message_received(message, *args, &block)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 139 def message_received(message, *args, &block) record_message_received message, *args, &block expectation = find_matching_expectation(message, *args) stub = find_matching_method_stub(message, *args) if (stub && expectation && expectation.called_max_times?) || (stub && !expectation) expectation.increase_actual_received_count! if expectation && expectation.actual_received_count_matters? if expectation = find_almost_matching_expectation(message, *args) expectation.advise(*args) unless expectation.expected_messages_received? end stub.invoke(nil, *args, &block) elsif expectation expectation.invoke(stub, *args, &block) elsif expectation = find_almost_matching_expectation(message, *args) expectation.advise(*args) if null_object? unless expectation.expected_messages_received? raise_unexpected_message_args_error(expectation, *args) unless (has_negative_expectation?(message) or null_object?) elsif stub = find_almost_matching_stub(message, *args) stub.advise(*args) raise_missing_default_stub_error(stub, *args) elsif @object.is_a?(Class) @object.superclass.__send__(message, *args, &block) else @object.__send__(:method_missing, message, *args, &block) end end
null_object?()
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 22 def null_object? @null_object end
raise_missing_default_stub_error(expectation, *args)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 176 def raise_missing_default_stub_error(expectation, *args) @error_generator.raise_missing_default_stub_error(expectation, *args) end
raise_unexpected_message_args_error(expectation, *args)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 171 def raise_unexpected_message_args_error(expectation, *args) @error_generator.raise_unexpected_message_args_error(expectation, *args) end
raise_unexpected_message_error(method_name, *args)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 166 def raise_unexpected_message_error(method_name, *args) @error_generator.raise_unexpected_message_error method_name, *args end
received_message?(method_name, *args, &block)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 124 def received_message?(method_name, *args, &block) @messages_received.any? {|array| array == [method_name, args, block]} end
record_message_received(message, *args, &block)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 134 def record_message_received(message, *args, &block) @messages_received << [message, args, block] end
remove_single_stub(method_name, stub)
click to toggle source
# File lib/rspec/mocks/proxy.rb, line 106 def remove_single_stub(method_name, stub) method_double[method_name].remove_single_stub(stub) end
remove_stub(method_name)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 102 def remove_stub(method_name) method_double[method_name].remove_stub end
replay_received_message_on(expectation)
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 68 def replay_received_message_on(expectation) expected_method_name = expectation.message meth_double = method_double[expected_method_name] if meth_double.expectations.any? @error_generator.raise_expectation_on_mocked_method(expected_method_name) end unless null_object? || meth_double.stubs.any? @error_generator.raise_expectation_on_unstubbed_method(expected_method_name) end @messages_received.each do |(actual_method_name, args, _)| if expectation.matches?(actual_method_name, *args) expectation.invoke(nil) end end end
reset()
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 118 def reset method_doubles.each {|d| d.reset} @messages_received.clear end
verify()
click to toggle source
@private
# File lib/rspec/mocks/proxy.rb, line 111 def verify method_doubles.each {|d| d.verify} ensure reset end
Private Instance Methods
find_almost_matching_expectation(method_name, *args)
click to toggle source
# File lib/rspec/mocks/proxy.rb, line 196 def find_almost_matching_expectation(method_name, *args) find_best_matching_expectation_for(method_name) do |expectation| expectation.matches_name_but_not_args(method_name, *args) end end
find_almost_matching_stub(method_name, *args)
click to toggle source
# File lib/rspec/mocks/proxy.rb, line 218 def find_almost_matching_stub(method_name, *args) method_double[method_name].stubs.find {|stub| stub.matches_name_but_not_args(method_name, *args)} end
find_best_matching_expectation_for(method_name) { |expectation| ... }
click to toggle source
# File lib/rspec/mocks/proxy.rb, line 202 def find_best_matching_expectation_for(method_name) first_match = nil method_double[method_name].expectations.each do |expectation| next unless yield expectation return expectation unless expectation.called_max_times? first_match ||= expectation end first_match end
find_matching_expectation(method_name, *args)
click to toggle source
# File lib/rspec/mocks/proxy.rb, line 190 def find_matching_expectation(method_name, *args) find_best_matching_expectation_for(method_name) do |expectation| expectation.matches?(method_name, *args) end end
find_matching_method_stub(method_name, *args)
click to toggle source
# File lib/rspec/mocks/proxy.rb, line 214 def find_matching_method_stub(method_name, *args) method_double[method_name].stubs.find {|stub| stub.matches?(method_name, *args)} end
method_double()
click to toggle source
# File lib/rspec/mocks/proxy.rb, line 182 def method_double @method_double ||= Hash.new {|h,k| h[k] = MethodDouble.new(@object, k, self) } end
method_doubles()
click to toggle source
# File lib/rspec/mocks/proxy.rb, line 186 def method_doubles method_double.values end