# File lib/rr/injections/double_injection.rb, line 96 def initialize(subject_class, method_name) @subject_class = subject_class @method_name = method_name.to_sym @doubles = [] @dispatch_method_delegates_to_dispatch_original_method = nil end
# File lib/rr/version.rb, line 4 def self.version; VERSION; end
# File lib/rr/times_called_matchers/times_called_matcher.rb, line 30 def ==(other) self.class == other.class && self.times == other.times end
# File lib/rr/times_called_matchers/times_called_matcher.rb, line 23 def attempt?(times_called) end
RR::DoubleInjection#bind injects a method that acts as a dispatcher that dispatches to the matching Double when the method is called.
# File lib/rr/injections/double_injection.rb, line 112 def bind if subject_has_method_defined?(method_name) bind_method_with_alias else Injections::MethodMissingInjection.find_or_create(subject_class) Injections::SingletonMethodAddedInjection.find_or_create(subject_class) bind_method_that_self_destructs_and_delegates_to_method_missing end self end
# File lib/rr/injections/double_injection.rb, line 140 def bind_method id = BoundObjects.size BoundObjects[id] = subject_class subject_class.class_eval(" def #{method_name}(*args, &block) arguments = MethodArguments.new(args, block) obj = ::RR::Injections::DoubleInjection::BoundObjects[#{id}] RR::Injections::DoubleInjection.dispatch_method(self, obj, :#{method_name}, arguments.arguments, arguments.block) end ", __FILE__, __LINE__ + 1) self end
# File lib/rr/injections/double_injection.rb, line 125 def bind_method_that_self_destructs_and_delegates_to_method_missing id = BoundObjects.size BoundObjects[id] = subject_class subject_class.class_eval(" def #{method_name}(*args, &block) ::RR::Injections::DoubleInjection::BoundObjects[#{id}].class_eval do remove_method(:#{method_name}) end method_missing(:#{method_name}, *args, &block) end ", __FILE__, __LINE__ + 1) self end
# File lib/rr/injections/double_injection.rb, line 178 def dispatch_method(subject, args, block) if @dispatch_method_delegates_to_dispatch_original_method dispatch_original_method(subject, args, block) else dispatch = MethodDispatches::MethodDispatch.new(self, subject, args, block) dispatch.call end end
# File lib/rr/injections/double_injection.rb, line 200 def dispatch_method_delegates_to_dispatch_original_method @dispatch_method_delegates_to_dispatch_original_method = true yield ensure @dispatch_method_delegates_to_dispatch_original_method = nil end
# File lib/rr/injections/double_injection.rb, line 187 def dispatch_original_method(subject, args, block) dispatch = MethodDispatches::MethodDispatch.new(self, subject, args, block) dispatch.call_original_method end
# File lib/rr/times_called_matchers/times_called_matcher.rb, line 26 def error_message(times_called) "Called #{times_called.inspect} #{pluralized_time(times_called)}.\nExpected #{expected_times_message}." end
# File lib/rr/times_called_matchers/times_called_matcher.rb, line 34 def expected_times_message "#{@times.inspect} times" end
# File lib/rr/double.rb, line 12 def list_message_part(doubles) doubles.collect do |double| "- #{formatted_name(double.method_name, double.expected_arguments)}" end.join("\n") end
# File lib/rr/times_called_matchers/times_called_matcher.rb, line 20 def matches?(times_called) end
# File lib/rr/injections/method_missing_injection.rb, line 32 def method_missing(method_name, *args, &block) super end
# File lib/rr/injections/double_injection.rb, line 196 def original_method_alias_name "__rr__original_#{@method_name}" end
It binds the original method implementation on the subject if one exists.
# File lib/rr/injections/double_injection.rb, line 166 def reset if subject_has_original_method? subject_class.__send__(:remove_method, method_name) subject_class.__send__(:alias_method, method_name, original_method_alias_name) subject_class.__send__(:remove_method, original_method_alias_name) else if subject_has_method_defined?(method_name) subject_class.__send__(:remove_method, method_name) end end end
# File lib/rr/double_definitions/double_definition_create.rb, line 11 def set_default_double_injection_strategy(strategy_lambda) original_strategy_lambda = default_double_injection_strategy begin @default_double_injection_strategy = strategy_lambda yield ensure @default_double_injection_strategy = original_strategy_lambda end end
# File lib/rr/injections/double_injection.rb, line 192 def subject_has_original_method_missing? class_instance_method_defined(subject_class, MethodDispatches::MethodMissingDispatch.original_method_missing_alias_name) end
# File lib/rr/injections/method_missing_injection.rb, line 46 def to_ary; nil; end
RR::DoubleInjection#verify verifies each Double TimesCalledExpectation are met.
# File lib/rr/injections/double_injection.rb, line 156 def verify @doubles.each do |double| double.verify end end
# File lib/rr/injections/double_injection.rb, line 215 def bind_method_with_alias subject_class.__send__(:alias_method, original_method_alias_name, method_name) bind_method end
# File lib/rr/injections/double_injection.rb, line 208 def deferred_bind_method unless subject_has_method_defined?(original_method_alias_name) bind_method_with_alias end @performed_deferred_bind = true end
# File lib/rr/times_called_matchers/times_called_matcher.rb, line 39 def pluralized_time(times_called) (times_called == 1) ? "time" : "times" end