rspec-mocks 2.99.4 → 3.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. checksums.yaml +14 -6
  2. checksums.yaml.gz.sig +2 -0
  3. data.tar.gz.sig +1 -0
  4. data/Changelog.md +89 -105
  5. data/License.txt +1 -0
  6. data/README.md +77 -57
  7. data/features/argument_matchers/explicit.feature +5 -5
  8. data/features/argument_matchers/general_matchers.feature +10 -10
  9. data/features/argument_matchers/type_matchers.feature +3 -3
  10. data/features/message_expectations/allow_any_instance_of.feature +1 -1
  11. data/features/message_expectations/any_instance.feature +27 -5
  12. data/features/message_expectations/call_original.feature +2 -2
  13. data/features/message_expectations/expect_message_using_expect.feature +2 -2
  14. data/features/message_expectations/expect_message_using_should_receive.feature +2 -2
  15. data/features/message_expectations/receive_counts.feature +7 -7
  16. data/features/message_expectations/warn_when_expectation_is_set_on_nil.feature +3 -3
  17. data/features/method_stubs/README.md +3 -0
  18. data/features/method_stubs/any_instance.feature +11 -11
  19. data/features/method_stubs/as_null_object.feature +4 -4
  20. data/features/method_stubs/simple_return_value_with_stub.feature +7 -7
  21. data/features/method_stubs/stub_chain.feature +3 -3
  22. data/features/method_stubs/stub_implementation.feature +2 -2
  23. data/features/method_stubs/to_ary.feature +2 -2
  24. data/features/mutating_constants/hiding_defined_constant.feature +2 -2
  25. data/features/mutating_constants/stub_defined_constant.feature +5 -5
  26. data/features/mutating_constants/stub_undefined_constant.feature +6 -6
  27. data/features/outside_rspec/configuration.feature +0 -2
  28. data/features/outside_rspec/standalone.feature +1 -1
  29. data/features/spies/spy_partial_mock_method.feature +2 -2
  30. data/features/spies/spy_pure_mock_method.feature +5 -5
  31. data/features/spies/spy_unstubbed_method.feature +1 -1
  32. data/features/support/env.rb +10 -1
  33. data/features/test_frameworks/test_unit.feature +1 -1
  34. data/features/verifying_doubles/class_doubles.feature +88 -0
  35. data/features/verifying_doubles/dynamic_classes.feature +72 -0
  36. data/features/verifying_doubles/introduction.feature +85 -0
  37. data/features/verifying_doubles/object_doubles.feature +65 -0
  38. data/features/verifying_doubles/partial_doubles.feature +34 -0
  39. data/lib/rspec/mocks.rb +8 -34
  40. data/lib/rspec/mocks/any_instance/chain.rb +4 -34
  41. data/lib/rspec/mocks/any_instance/expectation_chain.rb +14 -4
  42. data/lib/rspec/mocks/any_instance/message_chains.rb +27 -12
  43. data/lib/rspec/mocks/any_instance/recorder.rb +23 -31
  44. data/lib/rspec/mocks/any_instance/stub_chain.rb +9 -4
  45. data/lib/rspec/mocks/argument_list_matcher.rb +8 -1
  46. data/lib/rspec/mocks/argument_matchers.rb +26 -12
  47. data/lib/rspec/mocks/arity_calculator.rb +66 -0
  48. data/lib/rspec/mocks/configuration.rb +42 -14
  49. data/lib/rspec/mocks/error_generator.rb +34 -10
  50. data/lib/rspec/mocks/example_methods.rb +64 -19
  51. data/lib/rspec/mocks/extensions/marshal.rb +0 -15
  52. data/lib/rspec/mocks/framework.rb +4 -4
  53. data/lib/rspec/mocks/instance_method_stasher.rb +80 -62
  54. data/lib/rspec/mocks/matchers/have_received.rb +18 -14
  55. data/lib/rspec/mocks/matchers/receive.rb +29 -7
  56. data/lib/rspec/mocks/matchers/receive_messages.rb +72 -0
  57. data/lib/rspec/mocks/message_expectation.rb +95 -148
  58. data/lib/rspec/mocks/method_double.rb +77 -139
  59. data/lib/rspec/mocks/method_reference.rb +95 -0
  60. data/lib/rspec/mocks/mock.rb +1 -1
  61. data/lib/rspec/mocks/mutate_const.rb +12 -9
  62. data/lib/rspec/mocks/object_reference.rb +90 -0
  63. data/lib/rspec/mocks/order_group.rb +49 -7
  64. data/lib/rspec/mocks/proxy.rb +72 -33
  65. data/lib/rspec/mocks/proxy_for_nil.rb +2 -2
  66. data/lib/rspec/mocks/space.rb +13 -18
  67. data/lib/rspec/mocks/stub_chain.rb +2 -2
  68. data/lib/rspec/mocks/syntax.rb +61 -36
  69. data/lib/rspec/mocks/targets.rb +40 -19
  70. data/lib/rspec/mocks/test_double.rb +12 -56
  71. data/lib/rspec/mocks/verifying_double.rb +77 -0
  72. data/lib/rspec/mocks/verifying_message_expecation.rb +60 -0
  73. data/lib/rspec/mocks/verifying_proxy.rb +151 -0
  74. data/lib/rspec/mocks/version.rb +1 -1
  75. data/spec/rspec/mocks/and_call_original_spec.rb +34 -30
  76. data/spec/rspec/mocks/and_yield_spec.rb +2 -2
  77. data/spec/rspec/mocks/any_instance/message_chains_spec.rb +1 -1
  78. data/spec/rspec/mocks/any_instance_spec.rb +53 -260
  79. data/spec/rspec/mocks/argument_expectation_spec.rb +4 -4
  80. data/spec/rspec/mocks/arity_calculator_spec.rb +95 -0
  81. data/spec/rspec/mocks/array_including_matcher_spec.rb +41 -0
  82. data/spec/rspec/mocks/at_least_spec.rb +4 -32
  83. data/spec/rspec/mocks/block_return_value_spec.rb +4 -135
  84. data/spec/rspec/mocks/combining_implementation_instructions_spec.rb +10 -11
  85. data/spec/rspec/mocks/configuration_spec.rb +79 -0
  86. data/spec/rspec/mocks/double_spec.rb +10 -78
  87. data/spec/rspec/mocks/extensions/marshal_spec.rb +0 -8
  88. data/spec/rspec/mocks/failing_argument_matchers_spec.rb +49 -4
  89. data/spec/rspec/mocks/instance_method_stasher_spec.rb +20 -3
  90. data/spec/rspec/mocks/matchers/have_received_spec.rb +74 -0
  91. data/spec/rspec/mocks/matchers/receive_messages_spec.rb +140 -0
  92. data/spec/rspec/mocks/matchers/receive_spec.rb +82 -42
  93. data/spec/rspec/mocks/methods_spec.rb +1 -1
  94. data/spec/rspec/mocks/{bug_report_830_spec.rb → mock_expectation_error_spec.rb} +4 -3
  95. data/spec/rspec/mocks/mock_ordering_spec.rb +11 -0
  96. data/spec/rspec/mocks/mock_space_spec.rb +10 -1
  97. data/spec/rspec/mocks/mock_spec.rb +26 -82
  98. data/spec/rspec/mocks/multiple_return_value_spec.rb +1 -1
  99. data/spec/rspec/mocks/mutate_const_spec.rb +18 -5
  100. data/spec/rspec/mocks/null_object_mock_spec.rb +6 -4
  101. data/spec/rspec/mocks/options_hash_spec.rb +3 -3
  102. data/spec/rspec/mocks/order_group_spec.rb +27 -0
  103. data/spec/rspec/mocks/partial_mock_spec.rb +101 -1
  104. data/spec/rspec/mocks/passing_argument_matchers_spec.rb +3 -20
  105. data/spec/rspec/mocks/record_messages_spec.rb +4 -4
  106. data/spec/rspec/mocks/serialization_spec.rb +4 -6
  107. data/spec/rspec/mocks/space_spec.rb +3 -3
  108. data/spec/rspec/mocks/stub_chain_spec.rb +0 -12
  109. data/spec/rspec/mocks/stub_spec.rb +23 -44
  110. data/spec/rspec/mocks/test_double_spec.rb +3 -22
  111. data/spec/rspec/mocks/verifying_double_spec.rb +327 -0
  112. data/spec/rspec/mocks/verifying_message_expecation_spec.rb +68 -0
  113. data/spec/rspec/mocks_spec.rb +16 -39
  114. data/spec/spec_helper.rb +29 -18
  115. metadata +131 -86
  116. metadata.gz.sig +1 -0
  117. data/features/message_expectations/expect_any_instance_of.feature +0 -27
  118. data/lib/rspec/mocks/caller_filter.rb +0 -60
  119. data/lib/rspec/mocks/deprecation.rb +0 -26
  120. data/lib/rspec/mocks/extensions/instance_exec.rb +0 -34
  121. data/lib/rspec/mocks/extensions/proc.rb +0 -63
  122. data/lib/spec/mocks.rb +0 -4
  123. data/spec/rspec/mocks/and_return_spec.rb +0 -17
  124. data/spec/rspec/mocks/any_number_of_times_spec.rb +0 -36
  125. data/spec/rspec/mocks/before_all_spec.rb +0 -74
  126. data/spec/rspec/mocks/bug_report_10260_spec.rb +0 -8
  127. data/spec/rspec/mocks/bug_report_10263_spec.rb +0 -27
  128. data/spec/rspec/mocks/bug_report_11545_spec.rb +0 -32
  129. data/spec/rspec/mocks/bug_report_496_spec.rb +0 -17
  130. data/spec/rspec/mocks/bug_report_600_spec.rb +0 -22
  131. data/spec/rspec/mocks/bug_report_7611_spec.rb +0 -16
  132. data/spec/rspec/mocks/bug_report_8165_spec.rb +0 -31
  133. data/spec/rspec/mocks/bug_report_957_spec.rb +0 -22
@@ -0,0 +1,90 @@
1
+ module RSpec
2
+ module Mocks
3
+
4
+ # @api private
5
+ class ObjectReference
6
+ # Returns an appropriate Object or Module reference based
7
+ # on the given argument.
8
+ def self.for(object_module_or_name, allow_direct_object_refs = false)
9
+ case object_module_or_name
10
+ when Module then DirectModuleReference.new(object_module_or_name)
11
+ when String then NamedObjectReference.new(object_module_or_name)
12
+ else
13
+ if allow_direct_object_refs
14
+ DirectObjectReference.new(object_module_or_name)
15
+ else
16
+ raise ArgumentError,
17
+ "Module or String expected, got #{object_module_or_name.inspect}"
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ # Used when an object is passed to `object_double`.
24
+ # Represents a reference to that object.
25
+ # @api private
26
+ class DirectObjectReference
27
+ def initialize(object)
28
+ @object = object
29
+ end
30
+
31
+ def description
32
+ @object.inspect
33
+ end
34
+
35
+ def const_to_replace
36
+ raise ArgumentError,
37
+ "Can not perform constant replacement with an object."
38
+ end
39
+
40
+ def defined?
41
+ true
42
+ end
43
+
44
+ def when_loaded
45
+ yield @object
46
+ end
47
+ end
48
+
49
+ # Used when a module is passed to `class_double` or `instance_double`.
50
+ # Represents a reference to that module.
51
+ # @api private
52
+ class DirectModuleReference < DirectObjectReference
53
+ def const_to_replace
54
+ @object.name
55
+ end
56
+ alias description const_to_replace
57
+ end
58
+
59
+ # Used when a string is passed to `class_double`, `instance_double`
60
+ # or `object_double`.
61
+ # Represents a reference to the object named (via a constant lookup)
62
+ # by the string.
63
+ # @api private
64
+ class NamedObjectReference
65
+ def initialize(const_name)
66
+ @const_name = const_name
67
+ end
68
+
69
+ def defined?
70
+ !!object
71
+ end
72
+
73
+ def const_to_replace
74
+ @const_name
75
+ end
76
+ alias description const_to_replace
77
+
78
+ def when_loaded(&block)
79
+ yield object if object
80
+ end
81
+
82
+ private
83
+
84
+ def object
85
+ @object ||= Constant.original(@const_name).original_value
86
+ end
87
+ end
88
+ end
89
+ end
90
+
@@ -3,38 +3,80 @@ module RSpec
3
3
  # @private
4
4
  class OrderGroup
5
5
  def initialize
6
- @ordering = Array.new
6
+ @expectations = []
7
+ @invocation_order = []
8
+ @index = 0
7
9
  end
8
10
 
9
11
  # @private
10
12
  def register(expectation)
11
- @ordering << expectation
13
+ @expectations << expectation
14
+ end
15
+
16
+ def invoked(message)
17
+ @invocation_order << message
12
18
  end
13
19
 
14
20
  # @private
15
21
  def ready_for?(expectation)
16
- @ordering.first == expectation
22
+ remaining_expectations.find(&:ordered?) == expectation
17
23
  end
18
24
 
19
25
  # @private
20
26
  def consume
21
- @ordering.shift
27
+ remaining_expectations.each_with_index do |expectation, index|
28
+ if expectation.ordered?
29
+ @index += index + 1
30
+ return expectation
31
+ end
32
+ end
33
+ nil
22
34
  end
23
35
 
24
36
  # @private
25
37
  def handle_order_constraint(expectation)
26
- return unless @ordering.include?(expectation)
38
+ return unless expectation.ordered? && remaining_expectations.include?(expectation)
27
39
  return consume if ready_for?(expectation)
28
40
  expectation.raise_out_of_order_error
29
41
  end
30
42
 
43
+ def verify_invocation_order(expectation)
44
+ expectation.raise_out_of_order_error unless expectations_invoked_in_order?
45
+ true
46
+ end
47
+
31
48
  def clear
32
- @ordering.clear
49
+ @index = 0
50
+ @invocation_order.clear
51
+ @expectations.clear
33
52
  end
34
53
 
35
54
  def empty?
36
- @ordering.empty?
55
+ @expectations.empty?
56
+ end
57
+
58
+ private
59
+
60
+ def remaining_expectations
61
+ @expectations[@index..-1] || []
62
+ end
63
+
64
+ def expectations_invoked_in_order?
65
+ invoked_expectations == expected_invocations
66
+ end
67
+
68
+ def invoked_expectations
69
+ @expectations.select { |e| e.ordered? && @invocation_order.include?(e) }
70
+ end
71
+
72
+ def expected_invocations
73
+ @invocation_order.map { |invocation| expectation_for(invocation) }.compact
74
+ end
75
+
76
+ def expectation_for(message)
77
+ @expectations.find { |e| message == e }
37
78
  end
79
+
38
80
  end
39
81
  end
40
82
  end
@@ -2,17 +2,23 @@ module RSpec
2
2
  module Mocks
3
3
  # @private
4
4
  class Proxy
5
+ SpecificMessage = Struct.new(:object,:message) do
6
+ def ==(expectation)
7
+ expectation.orig_object == object && expectation.message == message
8
+ end
9
+ end
5
10
 
6
11
  # @private
7
- def initialize(object, name=nil, options={})
12
+ def initialize(object, order_group, name=nil, options={})
8
13
  @object = object
14
+ @order_group = order_group
9
15
  @name = name
10
- @error_generator = ErrorGenerator.new object, name, options
16
+ @error_generator = ErrorGenerator.new(object, name)
11
17
  @expectation_ordering = RSpec::Mocks::space.expectation_ordering
12
18
  @messages_received = []
13
19
  @options = options
14
- @already_proxied_respond_to = false
15
20
  @null_object = false
21
+ @method_doubles = Hash.new { |h, k| h[k] = MethodDouble.new(@object, k, self) }
16
22
  end
17
23
 
18
24
  # @private
@@ -32,18 +38,13 @@ module RSpec
32
38
  end
33
39
 
34
40
  # @private
35
- def already_proxied_respond_to
36
- @already_proxied_respond_to = true
37
- end
38
-
39
- # @private
40
- def already_proxied_respond_to?
41
- @already_proxied_respond_to
41
+ def method_handle_for(message)
42
+ nil
42
43
  end
43
44
 
44
45
  # @private
45
46
  def add_message_expectation(location, method_name, opts={}, &block)
46
- meth_double = method_double[method_name]
47
+ meth_double = method_double_for(method_name)
47
48
 
48
49
  if null_object? && !block
49
50
  meth_double.add_default_stub(@error_generator, @expectation_ordering, location, opts) do
@@ -54,9 +55,14 @@ module RSpec
54
55
  meth_double.add_expectation @error_generator, @expectation_ordering, location, opts, &block
55
56
  end
56
57
 
58
+ # @private
59
+ def add_simple_expectation(method_name, response, location)
60
+ method_double_for(method_name).add_simple_expectation method_name, response, @error_generator, location
61
+ end
62
+
57
63
  # @private
58
64
  def build_expectation(method_name)
59
- meth_double = method_double[method_name]
65
+ meth_double = method_double_for(method_name)
60
66
 
61
67
  meth_double.build_expectation(
62
68
  @error_generator,
@@ -65,9 +71,9 @@ module RSpec
65
71
  end
66
72
 
67
73
  # @private
68
- def replay_received_message_on(expectation)
74
+ def replay_received_message_on(expectation, &block)
69
75
  expected_method_name = expectation.message
70
- meth_double = method_double[expected_method_name]
76
+ meth_double = method_double_for(expected_method_name)
71
77
 
72
78
  if meth_double.expectations.any?
73
79
  @error_generator.raise_expectation_on_mocked_method(expected_method_name)
@@ -80,8 +86,10 @@ module RSpec
80
86
  @messages_received.each do |(actual_method_name, args, _)|
81
87
  if expectation.matches?(actual_method_name, *args)
82
88
  expectation.invoke(nil)
89
+ block.call(*args) if block
83
90
  end
84
91
  end
92
+
85
93
  end
86
94
 
87
95
  # @private
@@ -95,28 +103,34 @@ module RSpec
95
103
 
96
104
  # @private
97
105
  def add_stub(location, method_name, opts={}, &implementation)
98
- method_double[method_name].add_stub @error_generator, @expectation_ordering, location, opts, &implementation
106
+ method_double_for(method_name).add_stub @error_generator, @expectation_ordering, location, opts, &implementation
107
+ end
108
+
109
+ # @private
110
+ def add_simple_stub(method_name, response)
111
+ method_double_for(method_name).add_simple_stub method_name, response
99
112
  end
100
113
 
101
114
  # @private
102
115
  def remove_stub(method_name)
103
- method_double[method_name].remove_stub
116
+ method_double_for(method_name).remove_stub
104
117
  end
105
118
 
119
+ # @private
106
120
  def remove_single_stub(method_name, stub)
107
- method_double[method_name].remove_single_stub(stub)
121
+ method_double_for(method_name).remove_single_stub(stub)
108
122
  end
109
123
 
110
124
  # @private
111
125
  def verify
112
- method_doubles.each {|d| d.verify}
126
+ @method_doubles.each_value {|d| d.verify}
113
127
  ensure
114
128
  reset
115
129
  end
116
130
 
117
131
  # @private
118
132
  def reset
119
- method_doubles.each {|d| d.reset}
133
+ @method_doubles.each_value {|d| d.reset}
120
134
  @messages_received.clear
121
135
  end
122
136
 
@@ -127,11 +141,12 @@ module RSpec
127
141
 
128
142
  # @private
129
143
  def has_negative_expectation?(message)
130
- method_double[message].expectations.detect {|expectation| expectation.negative_expectation_for?(message)}
144
+ method_double_for(message).expectations.detect {|expectation| expectation.negative_expectation_for?(message)}
131
145
  end
132
146
 
133
147
  # @private
134
148
  def record_message_received(message, *args, &block)
149
+ @order_group.invoked SpecificMessage.new(object, message)
135
150
  @messages_received << [message, args, block]
136
151
  end
137
152
 
@@ -155,7 +170,7 @@ module RSpec
155
170
  elsif stub = find_almost_matching_stub(message, *args)
156
171
  stub.advise(*args)
157
172
  raise_missing_default_stub_error(stub, *args)
158
- elsif @object.is_a?(Class)
173
+ elsif Class === @object
159
174
  @object.superclass.__send__(message, *args, &block)
160
175
  else
161
176
  @object.__send__(:method_missing, message, *args, &block)
@@ -179,12 +194,8 @@ module RSpec
179
194
 
180
195
  private
181
196
 
182
- def method_double
183
- @method_double ||= Hash.new {|h,k| h[k] = MethodDouble.new(@object, k, self) }
184
- end
185
-
186
- def method_doubles
187
- method_double.values
197
+ def method_double_for(message)
198
+ @method_doubles[message.to_sym]
188
199
  end
189
200
 
190
201
  def find_matching_expectation(method_name, *args)
@@ -202,7 +213,7 @@ module RSpec
202
213
  def find_best_matching_expectation_for(method_name)
203
214
  first_match = nil
204
215
 
205
- method_double[method_name].expectations.each do |expectation|
216
+ method_double_for(method_name).expectations.each do |expectation|
206
217
  next unless yield expectation
207
218
  return expectation unless expectation.called_max_times?
208
219
  first_match ||= expectation
@@ -212,19 +223,47 @@ module RSpec
212
223
  end
213
224
 
214
225
  def find_matching_method_stub(method_name, *args)
215
- method_double[method_name].stubs.find {|stub| stub.matches?(method_name, *args)}
226
+ method_double_for(method_name).stubs.find {|stub| stub.matches?(method_name, *args)}
216
227
  end
217
228
 
218
229
  def find_almost_matching_stub(method_name, *args)
219
- method_double[method_name].stubs.find {|stub| stub.matches_name_but_not_args(method_name, *args)}
230
+ method_double_for(method_name).stubs.find {|stub| stub.matches_name_but_not_args(method_name, *args)}
220
231
  end
221
232
  end
222
233
 
223
- class TestDoubleProxy < Proxy
224
- def reset
225
- object.__warn_if_used_further!
234
+ class PartialMockProxy < Proxy
235
+ def method_handle_for(message)
236
+ if any_instance_class_recorder_observing_method?(@object.class, message)
237
+ message = ::RSpec::Mocks.
238
+ any_instance_recorder_for(@object.class).
239
+ build_alias_method_name(message)
240
+ end
241
+
242
+ ::RSpec::Mocks.method_handle_for(@object, message)
243
+ rescue NameError
244
+ nil
245
+ end
246
+
247
+ # @private
248
+ def add_simple_expectation(method_name, response, location)
249
+ method_double_for(method_name).configure_method
226
250
  super
227
251
  end
252
+
253
+ # @private
254
+ def add_simple_stub(method_name, response)
255
+ method_double_for(method_name).configure_method
256
+ super
257
+ end
258
+
259
+ private
260
+
261
+ def any_instance_class_recorder_observing_method?(klass, method_name)
262
+ return true if ::RSpec::Mocks.any_instance_recorder_for(klass).already_observing?(method_name)
263
+ superklass = klass.superclass
264
+ return false if superklass.nil?
265
+ any_instance_class_recorder_observing_method?(superklass, method_name)
266
+ end
228
267
  end
229
268
  end
230
269
  end
@@ -3,9 +3,9 @@ module RSpec
3
3
  # @private
4
4
  class ProxyForNil < Proxy
5
5
 
6
- def initialize
6
+ def initialize(order_group)
7
7
  @warn_about_expectations = true
8
- super nil
8
+ super nil, order_group
9
9
  end
10
10
  attr_accessor :warn_about_expectations
11
11
  alias warn_about_expectations? warn_about_expectations
@@ -2,13 +2,11 @@ module RSpec
2
2
  module Mocks
3
3
  # @api private
4
4
  class Space
5
- attr_reader :proxies, :any_instance_recorders
6
- attr_accessor :outside_example
5
+ attr_reader :proxies, :any_instance_recorders
7
6
 
8
7
  def initialize
9
8
  @proxies = {}
10
9
  @any_instance_recorders = {}
11
- self.outside_example = true
12
10
  end
13
11
 
14
12
  def verify_all
@@ -29,11 +27,6 @@ module RSpec
29
27
  end
30
28
 
31
29
  proxies.clear
32
-
33
- any_instance_recorders.each_value do |recorder|
34
- recorder.stop_all_observation!
35
- end
36
-
37
30
  any_instance_recorders.clear
38
31
  expectation_ordering.clear
39
32
  end
@@ -43,26 +36,32 @@ module RSpec
43
36
  end
44
37
 
45
38
  def any_instance_recorder_for(klass)
46
- print_out_of_example_deprecation if outside_example
47
39
  id = klass.__id__
48
40
  any_instance_recorders.fetch(id) do
49
41
  any_instance_recorders[id] = AnyInstance::Recorder.new(klass)
50
42
  end
51
43
  end
52
44
 
45
+ def remove_any_instance_recorder_for(klass)
46
+ any_instance_recorders.delete(klass.__id__)
47
+ end
48
+
53
49
  def proxies_of(klass)
54
50
  proxies.values.select { |proxy| klass === proxy.object }
55
51
  end
56
52
 
57
53
  def proxy_for(object)
58
- print_out_of_example_deprecation if outside_example
59
54
  id = id_for(object)
60
55
  proxies.fetch(id) do
61
56
  proxies[id] = case object
62
- when NilClass then ProxyForNil.new
63
- when TestDouble then object.__build_mock_proxy
57
+ when NilClass then ProxyForNil.new(expectation_ordering)
58
+ when TestDouble then object.__build_mock_proxy(expectation_ordering)
64
59
  else
65
- Proxy.new(object)
60
+ if RSpec::Mocks.configuration.verify_partial_doubles?
61
+ VerifyingPartialMockProxy.new(object, expectation_ordering)
62
+ else
63
+ PartialMockProxy.new(object, expectation_ordering)
64
+ end
66
65
  end
67
66
  end
68
67
  end
@@ -73,10 +72,6 @@ module RSpec
73
72
  proxies.has_key?(id_for object)
74
73
  end
75
74
 
76
- def print_out_of_example_deprecation
77
- RSpec.deprecate("Using rspec-mocks doubles or partial doubles outside the per-test lifecycle (such as in a `before(:all)` hook)")
78
- end
79
-
80
75
  if defined?(::BasicObject) && !::BasicObject.method_defined?(:__id__) # for 1.9.2
81
76
  require 'securerandom'
82
77
 
@@ -86,7 +81,7 @@ module RSpec
86
81
  return id if object.equal?(::ObjectSpace._id2ref(id))
87
82
  # this suggests that object.__id__ is proxying through to some wrapped object
88
83
 
89
- object.instance_eval do
84
+ object.instance_exec do
90
85
  @__id_for_rspec_mocks_space ||= ::SecureRandom.uuid
91
86
  end
92
87
  end