RR::DoubleInjection is the binding of an subject and a method. A double_injection has 0 to many Double objects. Each Double has Argument Expectations and Times called Expectations.
# File lib/rr/injections/double_injection.rb, line 8
8: def create(subject, method_name)
9: instances[subject][method_name.to_sym] ||= begin
10: new(subject, method_name.to_sym, (class << subject; self; end)).bind
11: end
12: end
# File lib/rr/injections/double_injection.rb, line 14
14: def exists?(subject, method_name)
15: instances.include?(subject) && instances[subject].include?(method_name.to_sym)
16: end
# File lib/rr/injections/double_injection.rb, line 51
51: def instances
52: @instances ||= HashWithObjectIdKey.new do |hash, subject_object|
53: hash.set_with_object_id(subject_object, {})
54: end
55: end
# File lib/rr/injections/double_injection.rb, line 62
62: def initialize(subject, method_name, subject_class)
63: @subject = subject
64: @subject_class = subject_class
65: @method_name = method_name.to_sym
66: @doubles = []
67: @bypass_bound_method = nil
68: end
# File lib/rr/injections/double_injection.rb, line 18
18: def reset
19: instances.each do |subject, method_double_map|
20: method_double_map.keys.each do |method_name|
21: reset_double(subject, method_name)
22: end
23: end
24: end
Resets the DoubleInjection for the passed in subject and method_name.
# File lib/rr/injections/double_injection.rb, line 45
45: def reset_double(subject, method_name)
46: double_injection = Injections::DoubleInjection.instances[subject].delete(method_name)
47: Injections::DoubleInjection.instances.delete(subject) if Injections::DoubleInjection.instances[subject].empty?
48: double_injection.reset
49: end
# File lib/rr/injections/double_injection.rb, line 26
26: def verify(*subjects)
27: subjects = Injections::DoubleInjection.instances.keys if subjects.empty?
28: subjects.each do |subject|
29: instances.include?(subject) &&
30: instances[subject].keys.each do |method_name|
31: verify_double(subject, method_name)
32: end &&
33: instances.delete(subject)
34: end
35: end
Verifies the DoubleInjection for the passed in subject and method_name.
# File lib/rr/injections/double_injection.rb, line 38
38: def verify_double(subject, method_name)
39: Injections::DoubleInjection.instances[subject][method_name].verify
40: ensure
41: reset_double subject, method_name
42: 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 79
79: def bind
80: if subject_respond_to_method?(method_name)
81: if subject_has_method_defined?(method_name)
82: if subject_is_proxy_for_method?(method_name)
83: bind_method
84: else
85: bind_method_with_alias
86: end
87: else
88: Injections::MethodMissingInjection.create(subject)
89: Injections::SingletonMethodAddedInjection.create(subject)
90: end
91: else
92: bind_method
93: end
94: self
95: end
# File lib/rr/injections/double_injection.rb, line 146
146: def bypass_bound_method
147: @bypass_bound_method = true
148: yield
149: ensure
150: @bypass_bound_method = nil
151: end
# File lib/rr/injections/double_injection.rb, line 121
121: def dispatch_method(args, block)
122: dispatch = MethodDispatches::MethodDispatch.new(self, args, block)
123: if @bypass_bound_method
124: dispatch.call_original_method
125: else
126: dispatch.call
127: end
128: end
# File lib/rr/injections/double_injection.rb, line 130
130: def dispatch_method_missing(method_name, args, block)
131: MethodDispatches::MethodMissingDispatch.new(subject, method_name, args, block).call
132: end
# File lib/rr/injections/double_injection.rb, line 138
138: def original_method_alias_name
139: "__rr__original_#{@method_name}"
140: end
# File lib/rr/injections/double_injection.rb, line 142
142: def original_method_missing_alias_name
143: MethodDispatches::MethodMissingDispatch.original_method_missing_alias_name
144: end
It binds the original method implementation on the subject if one exists.
# File lib/rr/injections/double_injection.rb, line 109
109: def reset
110: if subject_has_original_method?
111: subject_class.__send__(:remove_method, method_name)
112: subject_class.__send__(:alias_method, method_name, original_method_alias_name)
113: subject_class.__send__(:remove_method, original_method_alias_name)
114: else
115: if subject_has_method_defined?(method_name)
116: subject_class.__send__(:remove_method, method_name)
117: end
118: end
119: end
# File lib/rr/injections/double_injection.rb, line 134
134: def subject_has_original_method_missing?
135: subject_respond_to_method?(original_method_missing_alias_name)
136: end
RR::DoubleInjection#verify verifies each Double TimesCalledExpectation are met.
# File lib/rr/injections/double_injection.rb, line 99
99: def verify
100: @doubles.each do |double|
101: double.verify
102: end
103: end
# File lib/rr/injections/double_injection.rb, line 175
175: def bind_method
176: subject = @subject.is_a?(Class) && !@subject.name.to_s.empty? ? @subject.name : "self"
177: subject_class.class_eval( def #{@method_name}(*args, &block) arguments = MethodArguments.new(args, block) RR::Injections::DoubleInjection.create(#{subject}, :#{@method_name}).dispatch_method(arguments.arguments, arguments.block) end, __FILE__, __LINE__ + 1)
178: end
# File lib/rr/injections/double_injection.rb, line 170
170: def bind_method_with_alias
171: subject_class.__send__(:alias_method, original_method_alias_name, method_name)
172: bind_method
173: end
# File lib/rr/injections/double_injection.rb, line 163
163: def deferred_bind_method
164: unless subject_has_method_defined?(original_method_alias_name)
165: bind_method_with_alias
166: end
167: @performed_deferred_bind = true
168: end
# File lib/rr/injections/double_injection.rb, line 154
154: def subject_is_proxy_for_method?(method_name_in_question)
155: !(
156: class << @subject;
157: self;
158: end).
159: instance_methods.
160: detect {|method_name| method_name.to_sym == method_name_in_question.to_sym}
161: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.