rspec-mocks 2.13.1 → 2.14.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog.md +45 -4
- data/README.md +1 -1
- data/features/argument_matchers/README.md +2 -2
- data/features/argument_matchers/explicit.feature +2 -3
- data/features/argument_matchers/general_matchers.feature +2 -2
- data/features/argument_matchers/type_matchers.feature +3 -4
- data/features/message_expectations/README.md +2 -2
- data/features/message_expectations/any_instance.feature +2 -2
- data/features/message_expectations/block_local_expectations.feature.pending +3 -3
- data/features/message_expectations/expect_message_using_expect.feature +103 -0
- data/features/message_expectations/expect_message_using_should_receive.feature +118 -0
- data/features/message_expectations/receive_counts.feature +1 -1
- data/features/method_stubs/README.md +1 -1
- data/features/method_stubs/any_instance.feature +11 -11
- data/features/method_stubs/as_null_object.feature +1 -1
- data/features/method_stubs/stub_implementation.feature +2 -2
- data/features/outside_rspec/configuration.feature +0 -20
- data/features/spies/spy_partial_mock_method.feature +34 -0
- data/features/spies/spy_pure_mock_method.feature +76 -0
- data/features/spies/spy_unstubbed_method.feature +18 -0
- data/features/step_definitions/additional_cli_steps.rb +7 -0
- data/features/test_frameworks/test_unit.feature +43 -0
- data/lib/rspec/mocks.rb +9 -34
- data/lib/rspec/mocks/any_instance/chain.rb +8 -2
- data/lib/rspec/mocks/any_instance/expectation_chain.rb +19 -16
- data/lib/rspec/mocks/any_instance/recorder.rb +6 -3
- data/lib/rspec/mocks/any_instance/stub_chain.rb +11 -11
- data/lib/rspec/mocks/any_instance/stub_chain_chain.rb +8 -10
- data/lib/rspec/mocks/argument_list_matcher.rb +7 -3
- data/lib/rspec/mocks/configuration.rb +28 -1
- data/lib/rspec/mocks/deprecation.rb +18 -0
- data/lib/rspec/mocks/error_generator.rb +60 -8
- data/lib/rspec/mocks/errors.rb +1 -1
- data/lib/rspec/mocks/example_methods.rb +39 -3
- data/lib/rspec/mocks/extensions/marshal.rb +4 -10
- data/lib/rspec/mocks/framework.rb +16 -4
- data/lib/rspec/mocks/instance_method_stasher.rb +3 -0
- data/lib/rspec/mocks/matchers/have_received.rb +93 -0
- data/lib/rspec/mocks/matchers/receive.rb +92 -0
- data/lib/rspec/mocks/message_expectation.rb +66 -129
- data/lib/rspec/mocks/method_double.rb +50 -43
- data/lib/rspec/mocks/mutate_const.rb +8 -20
- data/lib/rspec/mocks/proxy.rb +41 -25
- data/lib/rspec/mocks/proxy_for_nil.rb +36 -0
- data/lib/rspec/mocks/space.rb +64 -11
- data/lib/rspec/mocks/stub_chain.rb +51 -0
- data/lib/rspec/mocks/syntax.rb +329 -0
- data/lib/rspec/mocks/targets.rb +69 -0
- data/lib/rspec/mocks/test_double.rb +25 -4
- data/lib/rspec/mocks/version.rb +1 -1
- data/lib/spec/mocks.rb +1 -3
- data/spec/rspec/mocks/and_call_original_spec.rb +8 -0
- data/spec/rspec/mocks/and_yield_spec.rb +6 -6
- data/spec/rspec/mocks/any_instance_spec.rb +43 -31
- data/spec/rspec/mocks/any_number_of_times_spec.rb +6 -0
- data/spec/rspec/mocks/argument_expectation_spec.rb +12 -14
- data/spec/rspec/mocks/at_least_spec.rb +46 -37
- data/spec/rspec/mocks/at_most_spec.rb +12 -12
- data/spec/rspec/mocks/block_return_value_spec.rb +18 -1
- data/spec/rspec/mocks/bug_report_10260_spec.rb +1 -1
- data/spec/rspec/mocks/bug_report_10263_spec.rb +1 -1
- data/spec/rspec/mocks/bug_report_11545_spec.rb +4 -4
- data/spec/rspec/mocks/bug_report_600_spec.rb +1 -1
- data/spec/rspec/mocks/bug_report_7611_spec.rb +1 -1
- data/spec/rspec/mocks/configuration_spec.rb +124 -0
- data/spec/rspec/mocks/double_spec.rb +13 -1
- data/spec/rspec/mocks/failing_argument_matchers_spec.rb +17 -1
- data/spec/rspec/mocks/hash_excluding_matcher_spec.rb +13 -13
- data/spec/rspec/mocks/matchers/have_received_spec.rb +266 -0
- data/spec/rspec/mocks/matchers/receive_spec.rb +318 -0
- data/spec/rspec/mocks/methods_spec.rb +27 -0
- data/spec/rspec/mocks/mock_ordering_spec.rb +4 -4
- data/spec/rspec/mocks/mock_space_spec.rb +94 -39
- data/spec/rspec/mocks/mock_spec.rb +65 -50
- data/spec/rspec/mocks/multiple_return_value_spec.rb +10 -10
- data/spec/rspec/mocks/mutate_const_spec.rb +21 -1
- data/spec/rspec/mocks/nil_expectation_warning_spec.rb +10 -4
- data/spec/rspec/mocks/null_object_mock_spec.rb +11 -2
- data/spec/rspec/mocks/once_counts_spec.rb +5 -5
- data/spec/rspec/mocks/options_hash_spec.rb +4 -4
- data/spec/rspec/mocks/partial_mock_spec.rb +20 -11
- data/spec/rspec/mocks/partial_mock_using_mocks_directly_spec.rb +7 -7
- data/spec/rspec/mocks/passing_argument_matchers_spec.rb +2 -2
- data/spec/rspec/mocks/precise_counts_spec.rb +6 -6
- data/spec/rspec/mocks/serialization_spec.rb +1 -22
- data/spec/rspec/mocks/stash_spec.rb +4 -12
- data/spec/rspec/mocks/stub_implementation_spec.rb +3 -3
- data/spec/rspec/mocks/stub_spec.rb +44 -20
- data/spec/rspec/mocks/stubbed_message_expectations_spec.rb +6 -6
- data/spec/rspec/mocks/twice_counts_spec.rb +6 -6
- data/spec/rspec/mocks_spec.rb +1 -3
- data/spec/spec_helper.rb +25 -1
- metadata +86 -81
- data/features/message_expectations/expect_message.feature +0 -94
- data/lib/rspec/mocks/any_instance.rb +0 -81
- data/lib/rspec/mocks/extensions/psych.rb +0 -23
- data/lib/rspec/mocks/methods.rb +0 -155
- data/lib/rspec/mocks/serialization.rb +0 -34
- data/spec/rspec/mocks/combining_implementation_instructions_spec.rb +0 -197
@@ -40,6 +40,14 @@ module RSpec
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
class ProcWithBlock < Struct.new(:object, :method_name)
|
44
|
+
|
45
|
+
def call(*args, &block)
|
46
|
+
self.object.__send__(:method_missing, self.method_name, *args, &block)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
43
51
|
# @private
|
44
52
|
def original_method
|
45
53
|
if @method_stasher.method_is_stashed?
|
@@ -55,48 +63,58 @@ module RSpec
|
|
55
63
|
# object rather than the proxy method.
|
56
64
|
meth
|
57
65
|
else
|
58
|
-
|
59
|
-
|
60
|
-
original_method_from_ancestor(object_singleton_class.ancestors)
|
61
|
-
rescue NameError
|
62
|
-
raise unless @object.respond_to?(:superclass)
|
63
|
-
|
64
|
-
# Example: a singleton method defined on @object's superclass.
|
65
|
-
#
|
66
|
-
# Note: we have to give precedence to instance methods
|
67
|
-
# defined on @object's class, because in a case like:
|
68
|
-
#
|
69
|
-
# `klass.should_receive(:new).and_call_original`
|
70
|
-
#
|
71
|
-
# ...we want `Class#new` bound to `klass` (which will return
|
72
|
-
# an instance of `klass`), not `klass.superclass.new` (which
|
73
|
-
# would return an instance of `klass.superclass`).
|
74
|
-
original_method_from_superclass
|
75
|
-
end
|
66
|
+
# Example: an instance method defined on one of @object's ancestors.
|
67
|
+
original_method_from_ancestry
|
76
68
|
end
|
77
69
|
rescue NameError
|
78
70
|
# We have no way of knowing if the object's method_missing
|
79
71
|
# will handle this message or not...but we can at least try.
|
80
72
|
# If it's not handled, a `NoMethodError` will be raised, just
|
81
73
|
# like normally.
|
82
|
-
|
83
|
-
@object.__send__(:method_missing, @method_name, *args, &block)
|
84
|
-
end
|
74
|
+
ProcWithBlock.new(@object,@method_name)
|
85
75
|
end
|
86
76
|
|
87
77
|
def original_unrecorded_any_instance_method
|
88
78
|
return nil unless any_instance_class_recorder_observing_method?(@object.class)
|
89
|
-
alias_name = @object.class.
|
79
|
+
alias_name = ::RSpec::Mocks.any_instance_recorder_for(@object.class).build_alias_method_name(@method_name)
|
90
80
|
@object.method(alias_name)
|
91
81
|
end
|
92
82
|
|
93
83
|
def any_instance_class_recorder_observing_method?(klass)
|
94
|
-
return true if klass.
|
84
|
+
return true if ::RSpec::Mocks.any_instance_recorder_for(klass).already_observing?(@method_name)
|
95
85
|
superklass = klass.superclass
|
96
86
|
return false if superklass.nil?
|
97
87
|
any_instance_class_recorder_observing_method?(superklass)
|
98
88
|
end
|
99
89
|
|
90
|
+
our_singleton_class = class << self; self; end
|
91
|
+
if our_singleton_class.ancestors.include? our_singleton_class
|
92
|
+
# In Ruby 2.1, ancestors include the correct ancestors, including the singleton classes
|
93
|
+
def original_method_from_ancestry
|
94
|
+
# Lookup in the ancestry, skipping over the singleton class itself
|
95
|
+
original_method_from_ancestor(object_singleton_class.ancestors.drop(1))
|
96
|
+
end
|
97
|
+
else
|
98
|
+
# @private
|
99
|
+
def original_method_from_ancestry
|
100
|
+
original_method_from_ancestor(object_singleton_class.ancestors)
|
101
|
+
rescue NameError
|
102
|
+
raise unless @object.respond_to?(:superclass)
|
103
|
+
|
104
|
+
# Example: a singleton method defined on @object's superclass.
|
105
|
+
#
|
106
|
+
# Note: we have to give precedence to instance methods
|
107
|
+
# defined on @object's class, because in a case like:
|
108
|
+
#
|
109
|
+
# `klass.should_receive(:new).and_call_original`
|
110
|
+
#
|
111
|
+
# ...we want `Class#new` bound to `klass` (which will return
|
112
|
+
# an instance of `klass`), not `klass.superclass.new` (which
|
113
|
+
# would return an instance of `klass.superclass`).
|
114
|
+
original_method_from_superclass
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
100
118
|
def original_method_from_ancestor(ancestors)
|
101
119
|
klass, *rest = ancestors
|
102
120
|
klass.instance_method(@method_name).bind(@object)
|
@@ -142,8 +160,6 @@ module RSpec
|
|
142
160
|
|
143
161
|
# @private
|
144
162
|
def configure_method
|
145
|
-
RSpec::Mocks::space.add(@object) if RSpec::Mocks::space
|
146
|
-
warn_if_nil_class
|
147
163
|
@original_visibility = visibility_for_method
|
148
164
|
@method_stasher.stash unless @method_is_proxied
|
149
165
|
define_proxy_method
|
@@ -155,7 +171,7 @@ module RSpec
|
|
155
171
|
|
156
172
|
object_singleton_class.class_eval <<-EOF, __FILE__, __LINE__ + 1
|
157
173
|
def #{@method_name}(*args, &block)
|
158
|
-
|
174
|
+
::RSpec::Mocks.proxy_for(self).message_received :#{@method_name}, *args, &block
|
159
175
|
end
|
160
176
|
#{visibility_for_method}
|
161
177
|
EOF
|
@@ -191,7 +207,6 @@ module RSpec
|
|
191
207
|
|
192
208
|
# @private
|
193
209
|
def reset
|
194
|
-
reset_nil_expectations_warning
|
195
210
|
restore_original_method
|
196
211
|
clear
|
197
212
|
end
|
@@ -220,6 +235,12 @@ module RSpec
|
|
220
235
|
expectation
|
221
236
|
end
|
222
237
|
|
238
|
+
# @private
|
239
|
+
def build_expectation(error_generator, expectation_ordering)
|
240
|
+
expected_from = IGNORED_BACKTRACE_LINE
|
241
|
+
MessageExpectation.new(error_generator, expectation_ordering, expected_from, self)
|
242
|
+
end
|
243
|
+
|
223
244
|
# @private
|
224
245
|
def add_stub(error_generator, expectation_ordering, expected_from, opts={}, &implementation)
|
225
246
|
configure_method
|
@@ -241,27 +262,13 @@ module RSpec
|
|
241
262
|
expectations.empty? ? reset : stubs.clear
|
242
263
|
end
|
243
264
|
|
244
|
-
# @private
|
245
|
-
def proxy_for_nil_class?
|
246
|
-
NilClass === @object
|
247
|
-
end
|
248
|
-
|
249
|
-
# @private
|
250
|
-
def warn_if_nil_class
|
251
|
-
if proxy_for_nil_class? & RSpec::Mocks::Proxy.warn_about_expectations_on_nil
|
252
|
-
Kernel.warn("An expectation of :#{@method_name} was set on nil. Called from #{caller[4]}. Use allow_message_expectations_on_nil to disable warnings.")
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
265
|
# @private
|
257
266
|
def raise_method_not_stubbed_error
|
258
|
-
raise MockExpectationError, "The method `#{method_name}` was not stubbed or was already unstubbed"
|
267
|
+
raise MockExpectationError, "The method `#{method_name}` was not stubbed or was already unstubbed"
|
259
268
|
end
|
260
269
|
|
261
270
|
# @private
|
262
|
-
|
263
|
-
RSpec::Mocks::Proxy.warn_about_expectations_on_nil = true if proxy_for_nil_class?
|
264
|
-
end
|
271
|
+
IGNORED_BACKTRACE_LINE = 'this backtrace line is ignored'
|
265
272
|
end
|
266
273
|
end
|
267
274
|
end
|
@@ -83,6 +83,9 @@ module RSpec
|
|
83
83
|
# @api private
|
84
84
|
def initialize(name)
|
85
85
|
@name = name
|
86
|
+
@previously_defined = false
|
87
|
+
@stubbed = false
|
88
|
+
@hidden = false
|
86
89
|
end
|
87
90
|
|
88
91
|
# @return [String] The fully qualified name of the constant.
|
@@ -222,7 +225,7 @@ module RSpec
|
|
222
225
|
@context = recursive_const_get(@context_parts.join('::'))
|
223
226
|
@original_value = get_const_defined_on(@context, @const_name)
|
224
227
|
|
225
|
-
@context.
|
228
|
+
@context.__send__(:remove_const, @const_name)
|
226
229
|
end
|
227
230
|
|
228
231
|
def to_constant
|
@@ -248,7 +251,7 @@ module RSpec
|
|
248
251
|
|
249
252
|
constants_to_transfer = verify_constants_to_transfer!
|
250
253
|
|
251
|
-
@context.
|
254
|
+
@context.__send__(:remove_const, @const_name)
|
252
255
|
@context.const_set(@const_name, @mutated_value)
|
253
256
|
|
254
257
|
transfer_nested_constants(constants_to_transfer)
|
@@ -263,7 +266,7 @@ module RSpec
|
|
263
266
|
end
|
264
267
|
|
265
268
|
def rspec_reset
|
266
|
-
@context.
|
269
|
+
@context.__send__(:remove_const, @const_name)
|
267
270
|
@context.const_set(@const_name, @original_value)
|
268
271
|
end
|
269
272
|
|
@@ -333,7 +336,7 @@ module RSpec
|
|
333
336
|
end
|
334
337
|
|
335
338
|
def rspec_reset
|
336
|
-
@deepest_defined_const.
|
339
|
+
@deepest_defined_const.__send__(:remove_const, @const_to_remove)
|
337
340
|
end
|
338
341
|
end
|
339
342
|
|
@@ -345,27 +348,13 @@ module RSpec
|
|
345
348
|
def self.mutate(mutator)
|
346
349
|
register_mutator(mutator)
|
347
350
|
mutator.mutate
|
348
|
-
ensure_registered_with_mocks_space
|
349
|
-
end
|
350
|
-
|
351
|
-
# Ensures the constant stubbing is registered with
|
352
|
-
# rspec-mocks space so that stubbed constants can
|
353
|
-
# be restored when examples finish.
|
354
|
-
#
|
355
|
-
# @api private
|
356
|
-
def self.ensure_registered_with_mocks_space
|
357
|
-
return if defined?(@registered_with_mocks_space) && @registered_with_mocks_space
|
358
|
-
::RSpec::Mocks.space.add(self)
|
359
|
-
@registered_with_mocks_space = true
|
360
351
|
end
|
361
352
|
|
362
353
|
# Resets all stubbed constants. This is called automatically
|
363
354
|
# by rspec-mocks when an example finishes.
|
364
355
|
#
|
365
356
|
# @api private
|
366
|
-
def self.
|
367
|
-
@registered_with_mocks_space = false
|
368
|
-
|
357
|
+
def self.reset_all
|
369
358
|
# We use reverse order so that if the same constant
|
370
359
|
# was stubbed multiple times, the original value gets
|
371
360
|
# properly restored.
|
@@ -412,4 +401,3 @@ module RSpec
|
|
412
401
|
ConstantStubber = ConstantMutator
|
413
402
|
end
|
414
403
|
end
|
415
|
-
|
data/lib/rspec/mocks/proxy.rb
CHANGED
@@ -2,31 +2,6 @@ module RSpec
|
|
2
2
|
module Mocks
|
3
3
|
# @private
|
4
4
|
class Proxy
|
5
|
-
class << self
|
6
|
-
# @private
|
7
|
-
def warn_about_expectations_on_nil
|
8
|
-
defined?(@warn_about_expectations_on_nil) ? @warn_about_expectations_on_nil : true
|
9
|
-
end
|
10
|
-
|
11
|
-
# @private
|
12
|
-
def warn_about_expectations_on_nil=(new_value)
|
13
|
-
@warn_about_expectations_on_nil = new_value
|
14
|
-
end
|
15
|
-
|
16
|
-
# @private
|
17
|
-
def allow_message_expectations_on_nil
|
18
|
-
@warn_about_expectations_on_nil = false
|
19
|
-
|
20
|
-
# ensure nil.rspec_verify is called even if an expectation is not set in the example
|
21
|
-
# otherwise the allowance would effect subsequent examples
|
22
|
-
RSpec::Mocks::space.add(nil) unless RSpec::Mocks::space.nil?
|
23
|
-
end
|
24
|
-
|
25
|
-
# @private
|
26
|
-
def allow_message_expectations_on_nil?
|
27
|
-
!warn_about_expectations_on_nil
|
28
|
-
end
|
29
|
-
end
|
30
5
|
|
31
6
|
# @private
|
32
7
|
def initialize(object, name=nil, options={})
|
@@ -81,6 +56,45 @@ module RSpec
|
|
81
56
|
method_double[method_name].add_negative_expectation @error_generator, @expectation_ordering, location, &implementation
|
82
57
|
end
|
83
58
|
|
59
|
+
# @private
|
60
|
+
def build_expectation(method_name)
|
61
|
+
meth_double = method_double[method_name]
|
62
|
+
|
63
|
+
meth_double.build_expectation(
|
64
|
+
@error_generator,
|
65
|
+
@expectation_ordering
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
# @private
|
70
|
+
def replay_received_message_on(expectation)
|
71
|
+
expected_method_name = expectation.message
|
72
|
+
meth_double = method_double[expected_method_name]
|
73
|
+
|
74
|
+
if meth_double.expectations.any?
|
75
|
+
@error_generator.raise_expectation_on_mocked_method(expected_method_name)
|
76
|
+
end
|
77
|
+
|
78
|
+
unless null_object? || meth_double.stubs.any?
|
79
|
+
@error_generator.raise_expectation_on_unstubbed_method(expected_method_name)
|
80
|
+
end
|
81
|
+
|
82
|
+
@messages_received.each do |(actual_method_name, args, _)|
|
83
|
+
if expectation.matches?(actual_method_name, *args)
|
84
|
+
expectation.invoke(nil)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# @private
|
90
|
+
def check_for_unexpected_arguments(expectation)
|
91
|
+
@messages_received.each do |(method_name, args, _)|
|
92
|
+
if expectation.matches_name_but_not_args(method_name, *args)
|
93
|
+
raise_unexpected_message_args_error(expectation, *args)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
84
98
|
# @private
|
85
99
|
def add_stub(location, method_name, opts={}, &implementation)
|
86
100
|
method_double[method_name].add_stub @error_generator, @expectation_ordering, location, opts, &implementation
|
@@ -101,6 +115,7 @@ module RSpec
|
|
101
115
|
# @private
|
102
116
|
def reset
|
103
117
|
method_doubles.each {|d| d.reset}
|
118
|
+
@messages_received.clear
|
104
119
|
end
|
105
120
|
|
106
121
|
# @private
|
@@ -120,6 +135,7 @@ module RSpec
|
|
120
135
|
|
121
136
|
# @private
|
122
137
|
def message_received(message, *args, &block)
|
138
|
+
record_message_received message, *args, &block
|
123
139
|
expectation = find_matching_expectation(message, *args)
|
124
140
|
stub = find_matching_method_stub(message, *args)
|
125
141
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Mocks
|
3
|
+
# @private
|
4
|
+
class ProxyForNil < Proxy
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@warn_about_expectations = true
|
8
|
+
super nil
|
9
|
+
end
|
10
|
+
attr_accessor :warn_about_expectations
|
11
|
+
alias warn_about_expectations? warn_about_expectations
|
12
|
+
|
13
|
+
def add_message_expectation(location, method_name, opts={}, &block)
|
14
|
+
warn(method_name) if warn_about_expectations?
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_negative_message_expectation(location, method_name, &implementation)
|
19
|
+
warn(method_name) if warn_about_expectations?
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_stub(location, method_name, opts={}, &implementation)
|
24
|
+
warn(method_name) if warn_about_expectations?
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def warn method_name
|
31
|
+
Kernel.warn("An expectation of :#{method_name} was set on nil. Called from #{caller[2]}. Use allow_message_expectations_on_nil to disable warnings.")
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/rspec/mocks/space.rb
CHANGED
@@ -2,21 +2,32 @@ module RSpec
|
|
2
2
|
module Mocks
|
3
3
|
# @api private
|
4
4
|
class Space
|
5
|
-
|
6
|
-
|
5
|
+
attr_reader :proxies, :any_instance_recorders
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@proxies = {}
|
9
|
+
@any_instance_recorders = {}
|
7
10
|
end
|
8
11
|
|
9
12
|
def verify_all
|
10
|
-
|
11
|
-
|
13
|
+
proxies.each_value do |object|
|
14
|
+
object.verify
|
15
|
+
end
|
16
|
+
|
17
|
+
any_instance_recorders.each_value do |recorder|
|
18
|
+
recorder.verify
|
12
19
|
end
|
13
20
|
end
|
14
21
|
|
15
22
|
def reset_all
|
16
|
-
|
17
|
-
|
23
|
+
ConstantMutator.reset_all
|
24
|
+
|
25
|
+
proxies.each_value do |object|
|
26
|
+
object.reset
|
18
27
|
end
|
19
|
-
|
28
|
+
|
29
|
+
proxies.clear
|
30
|
+
any_instance_recorders.clear
|
20
31
|
expectation_ordering.clear
|
21
32
|
end
|
22
33
|
|
@@ -24,10 +35,52 @@ module RSpec
|
|
24
35
|
@expectation_ordering ||= OrderGroup.new
|
25
36
|
end
|
26
37
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
38
|
+
def any_instance_recorder_for(klass)
|
39
|
+
id = klass.__id__
|
40
|
+
any_instance_recorders.fetch(id) do
|
41
|
+
any_instance_recorders[id] = AnyInstance::Recorder.new(klass)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def remove_any_instance_recorder_for(klass)
|
46
|
+
any_instance_recorders.delete(klass.__id__)
|
47
|
+
end
|
48
|
+
|
49
|
+
def proxy_for(object)
|
50
|
+
id = id_for(object)
|
51
|
+
proxies.fetch(id) do
|
52
|
+
proxies[id] = case object
|
53
|
+
when NilClass then ProxyForNil.new
|
54
|
+
when TestDouble then object.__build_mock_proxy
|
55
|
+
else
|
56
|
+
Proxy.new(object)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
alias ensure_registered proxy_for
|
62
|
+
|
63
|
+
def registered?(object)
|
64
|
+
proxies.has_key?(id_for object)
|
65
|
+
end
|
66
|
+
|
67
|
+
if defined?(::BasicObject) && !::BasicObject.method_defined?(:__id__) # for 1.9.2
|
68
|
+
require 'securerandom'
|
69
|
+
|
70
|
+
def id_for(object)
|
71
|
+
id = object.__id__
|
72
|
+
|
73
|
+
return id if object.equal?(::ObjectSpace._id2ref(id))
|
74
|
+
# this suggests that object.__id__ is proxying through to some wrapped object
|
75
|
+
|
76
|
+
object.instance_eval do
|
77
|
+
@__id_for_rspec_mocks_space ||= ::SecureRandom.uuid
|
78
|
+
end
|
79
|
+
end
|
80
|
+
else
|
81
|
+
def id_for(object)
|
82
|
+
object.__id__
|
83
|
+
end
|
31
84
|
end
|
32
85
|
end
|
33
86
|
end
|