rspec-mocks 3.0.4 → 3.12.6
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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/.document +1 -1
- data/.yardopts +1 -1
- data/Changelog.md +512 -2
- data/{License.txt → LICENSE.md} +5 -4
- data/README.md +113 -30
- data/lib/rspec/mocks/any_instance/chain.rb +5 -3
- data/lib/rspec/mocks/any_instance/error_generator.rb +31 -0
- data/lib/rspec/mocks/any_instance/expect_chain_chain.rb +1 -5
- data/lib/rspec/mocks/any_instance/expectation_chain.rb +9 -8
- data/lib/rspec/mocks/any_instance/message_chains.rb +7 -8
- data/lib/rspec/mocks/any_instance/proxy.rb +14 -5
- data/lib/rspec/mocks/any_instance/recorder.rb +61 -31
- data/lib/rspec/mocks/any_instance/stub_chain.rb +15 -11
- data/lib/rspec/mocks/any_instance/stub_chain_chain.rb +1 -5
- data/lib/rspec/mocks/any_instance.rb +1 -0
- data/lib/rspec/mocks/argument_list_matcher.rb +55 -10
- data/lib/rspec/mocks/argument_matchers.rb +88 -30
- data/lib/rspec/mocks/configuration.rb +61 -13
- data/lib/rspec/mocks/error_generator.rb +250 -107
- data/lib/rspec/mocks/example_methods.rb +151 -28
- data/lib/rspec/mocks/instance_method_stasher.rb +17 -6
- data/lib/rspec/mocks/matchers/have_received.rb +50 -20
- data/lib/rspec/mocks/matchers/receive.rb +39 -11
- data/lib/rspec/mocks/matchers/receive_message_chain.rb +22 -7
- data/lib/rspec/mocks/matchers/receive_messages.rb +12 -7
- data/lib/rspec/mocks/message_chain.rb +3 -7
- data/lib/rspec/mocks/message_expectation.rb +466 -307
- data/lib/rspec/mocks/method_double.rb +88 -29
- data/lib/rspec/mocks/method_reference.rb +85 -25
- data/lib/rspec/mocks/minitest_integration.rb +68 -0
- data/lib/rspec/mocks/mutate_const.rb +50 -109
- data/lib/rspec/mocks/object_reference.rb +89 -32
- data/lib/rspec/mocks/order_group.rb +4 -5
- data/lib/rspec/mocks/proxy.rb +156 -60
- data/lib/rspec/mocks/space.rb +52 -35
- data/lib/rspec/mocks/standalone.rb +1 -1
- data/lib/rspec/mocks/syntax.rb +26 -30
- data/lib/rspec/mocks/targets.rb +55 -28
- data/lib/rspec/mocks/test_double.rb +43 -7
- data/lib/rspec/mocks/verifying_double.rb +27 -33
- data/lib/rspec/mocks/{verifying_message_expecation.rb → verifying_message_expectation.rb} +11 -16
- data/lib/rspec/mocks/verifying_proxy.rb +77 -26
- data/lib/rspec/mocks/version.rb +1 -1
- data/lib/rspec/mocks.rb +8 -1
- data.tar.gz.sig +0 -0
- metadata +80 -43
- metadata.gz.sig +0 -0
@@ -2,8 +2,11 @@ module RSpec
|
|
2
2
|
module Mocks
|
3
3
|
# @private
|
4
4
|
class MethodDouble
|
5
|
+
# @private TODO: drop in favor of FrozenError in ruby 2.5+
|
6
|
+
FROZEN_ERROR_MSG = /can't modify frozen/
|
7
|
+
|
5
8
|
# @private
|
6
|
-
attr_reader :method_name, :object, :expectations, :stubs
|
9
|
+
attr_reader :method_name, :object, :expectations, :stubs, :method_stasher
|
7
10
|
|
8
11
|
# @private
|
9
12
|
def initialize(object, method_name, proxy)
|
@@ -18,20 +21,31 @@ module RSpec
|
|
18
21
|
@stubs = []
|
19
22
|
end
|
20
23
|
|
21
|
-
def
|
24
|
+
def original_implementation_callable
|
22
25
|
# If original method is not present, uses the `method_missing`
|
23
26
|
# handler of the object. This accounts for cases where the user has not
|
24
27
|
# correctly defined `respond_to?`, and also 1.8 which does not provide
|
25
28
|
# method handles for missing methods even if `respond_to?` is correct.
|
29
|
+
@original_implementation_callable ||= original_method || method_missing_block
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method :save_original_implementation_callable!, :original_implementation_callable
|
33
|
+
|
34
|
+
def original_method
|
26
35
|
@original_method ||=
|
27
36
|
@method_stasher.original_method ||
|
28
|
-
@proxy.original_method_handle_for(method_name)
|
29
|
-
Proc.new do |*args, &block|
|
30
|
-
@object.__send__(:method_missing, @method_name, *args, &block)
|
31
|
-
end
|
37
|
+
@proxy.original_method_handle_for(method_name)
|
32
38
|
end
|
33
39
|
|
34
|
-
|
40
|
+
# @private
|
41
|
+
def method_missing_block
|
42
|
+
block = Proc.new do |*args, &b|
|
43
|
+
@object.__send__(:method_missing, @method_name, *args, &b)
|
44
|
+
end
|
45
|
+
block.ruby2_keywords if block.respond_to?(:ruby2_keywords)
|
46
|
+
|
47
|
+
block
|
48
|
+
end
|
35
49
|
|
36
50
|
# @private
|
37
51
|
def visibility
|
@@ -45,7 +59,7 @@ module RSpec
|
|
45
59
|
|
46
60
|
# @private
|
47
61
|
def configure_method
|
48
|
-
@original_visibility =
|
62
|
+
@original_visibility = visibility
|
49
63
|
@method_stasher.stash unless @method_is_proxied
|
50
64
|
define_proxy_method
|
51
65
|
end
|
@@ -54,44 +68,62 @@ module RSpec
|
|
54
68
|
def define_proxy_method
|
55
69
|
return if @method_is_proxied
|
56
70
|
|
57
|
-
|
58
|
-
definition_target.class_exec(self, method_name, visibility) do |method_double, method_name, visibility|
|
71
|
+
save_original_implementation_callable!
|
72
|
+
definition_target.class_exec(self, method_name, @original_visibility || visibility) do |method_double, method_name, visibility|
|
59
73
|
define_method(method_name) do |*args, &block|
|
60
74
|
method_double.proxy_method_invoked(self, *args, &block)
|
61
75
|
end
|
62
|
-
|
76
|
+
# This can't be `if respond_to?(:ruby2_keywords, true)`,
|
77
|
+
# see https://github.com/rspec/rspec-mocks/pull/1385#issuecomment-755340298
|
78
|
+
ruby2_keywords(method_name) if Module.private_method_defined?(:ruby2_keywords)
|
79
|
+
__send__(visibility, method_name)
|
63
80
|
end
|
64
81
|
|
65
82
|
@method_is_proxied = true
|
83
|
+
rescue RuntimeError, TypeError => e
|
84
|
+
# TODO: drop in favor of FrozenError in ruby 2.5+
|
85
|
+
# RuntimeError (and FrozenError) for ruby 2.x
|
86
|
+
# TypeError for ruby 1.x
|
87
|
+
if (defined?(FrozenError) && e.is_a?(FrozenError)) || FROZEN_ERROR_MSG === e.message
|
88
|
+
raise ArgumentError, "Cannot proxy frozen objects, rspec-mocks relies on proxies for method stubbing and expectations."
|
89
|
+
end
|
90
|
+
raise
|
66
91
|
end
|
67
92
|
|
68
93
|
# The implementation of the proxied method. Subclasses may override this
|
69
94
|
# method to perform additional operations.
|
70
95
|
#
|
71
96
|
# @private
|
72
|
-
def proxy_method_invoked(
|
97
|
+
def proxy_method_invoked(_obj, *args, &block)
|
73
98
|
@proxy.message_received method_name, *args, &block
|
74
99
|
end
|
100
|
+
ruby2_keywords :proxy_method_invoked if respond_to?(:ruby2_keywords, true)
|
75
101
|
|
76
102
|
# @private
|
77
103
|
def restore_original_method
|
78
|
-
return show_frozen_warning if object_singleton_class.frozen?
|
79
104
|
return unless @method_is_proxied
|
80
105
|
|
81
|
-
|
82
|
-
|
83
|
-
if @method_stasher.method_is_stashed?
|
84
|
-
@method_stasher.restore
|
85
|
-
end
|
106
|
+
remove_method_from_definition_target
|
107
|
+
@method_stasher.restore if @method_stasher.method_is_stashed?
|
86
108
|
restore_original_visibility
|
87
109
|
|
88
110
|
@method_is_proxied = false
|
111
|
+
rescue RuntimeError, TypeError => e
|
112
|
+
# TODO: drop in favor of FrozenError in ruby 2.5+
|
113
|
+
# RuntimeError (and FrozenError) for ruby 2.x
|
114
|
+
# TypeError for ruby 1.x
|
115
|
+
if (defined?(FrozenError) && e.is_a?(FrozenError)) || FROZEN_ERROR_MSG === e.message
|
116
|
+
return show_frozen_warning
|
117
|
+
end
|
118
|
+
raise
|
89
119
|
end
|
90
120
|
|
91
121
|
# @private
|
92
122
|
def show_frozen_warning
|
93
123
|
RSpec.warn_with(
|
94
|
-
"WARNING: rspec-mocks was unable to restore the original `#{@method_name}`
|
124
|
+
"WARNING: rspec-mocks was unable to restore the original `#{@method_name}` " \
|
125
|
+
"method on #{@object.inspect} because it has been frozen. If you reuse this " \
|
126
|
+
"object, `#{@method_name}` will continue to respond with its stub implementation.",
|
95
127
|
:call_site => nil,
|
96
128
|
:use_spec_location_as_call_site => true
|
97
129
|
)
|
@@ -102,12 +134,12 @@ module RSpec
|
|
102
134
|
return unless @original_visibility &&
|
103
135
|
MethodReference.method_defined_at_any_visibility?(object_singleton_class, @method_name)
|
104
136
|
|
105
|
-
object_singleton_class.__send__(
|
137
|
+
object_singleton_class.__send__(@original_visibility, method_name)
|
106
138
|
end
|
107
139
|
|
108
140
|
# @private
|
109
141
|
def verify
|
110
|
-
expectations.each {|e| e.verify_messages_received}
|
142
|
+
expectations.each { |e| e.verify_messages_received }
|
111
143
|
end
|
112
144
|
|
113
145
|
# @private
|
@@ -134,7 +166,7 @@ module RSpec
|
|
134
166
|
def add_expectation(error_generator, expectation_ordering, expected_from, opts, &implementation)
|
135
167
|
configure_method
|
136
168
|
expectation = message_expectation_class.new(error_generator, expectation_ordering,
|
137
|
-
|
169
|
+
expected_from, self, :expectation, opts, &implementation)
|
138
170
|
expectations << expectation
|
139
171
|
expectation
|
140
172
|
end
|
@@ -149,7 +181,7 @@ module RSpec
|
|
149
181
|
def add_stub(error_generator, expectation_ordering, expected_from, opts={}, &implementation)
|
150
182
|
configure_method
|
151
183
|
stub = message_expectation_class.new(error_generator, expectation_ordering, expected_from,
|
152
|
-
|
184
|
+
self, :stub, opts, &implementation)
|
153
185
|
stubs.unshift stub
|
154
186
|
stub
|
155
187
|
end
|
@@ -172,7 +204,7 @@ module RSpec
|
|
172
204
|
end
|
173
205
|
|
174
206
|
# @private
|
175
|
-
def setup_simple_method_double(method_name, response, collection, error_generator
|
207
|
+
def setup_simple_method_double(method_name, response, collection, error_generator=nil, backtrace_line=nil)
|
176
208
|
define_proxy_method
|
177
209
|
|
178
210
|
me = SimpleMessageExpectation.new(method_name, response, error_generator, backtrace_line)
|
@@ -199,15 +231,13 @@ module RSpec
|
|
199
231
|
|
200
232
|
# @private
|
201
233
|
def raise_method_not_stubbed_error
|
202
|
-
|
234
|
+
RSpec::Mocks.error_generator.raise_method_not_stubbed_error(method_name)
|
203
235
|
end
|
204
236
|
|
205
|
-
private
|
206
|
-
|
207
237
|
# In Ruby 2.0.0 and above prepend will alter the method lookup chain.
|
208
238
|
# We use an object's singleton class to define method doubles upon,
|
209
|
-
# however if the object has had
|
210
|
-
#
|
239
|
+
# however if the object has had its singleton class (as opposed to
|
240
|
+
# its actual class) prepended too then the the method lookup chain
|
211
241
|
# will look in the prepended module first, **before** the singleton
|
212
242
|
# class.
|
213
243
|
#
|
@@ -216,6 +246,9 @@ module RSpec
|
|
216
246
|
# of our own.
|
217
247
|
#
|
218
248
|
if Support::RubyFeatures.module_prepends_supported?
|
249
|
+
|
250
|
+
private
|
251
|
+
|
219
252
|
# We subclass `Module` in order to be able to easily detect our prepended module.
|
220
253
|
RSpecPrependedModule = Class.new(Module)
|
221
254
|
|
@@ -247,11 +280,37 @@ module RSpec
|
|
247
280
|
|
248
281
|
else
|
249
282
|
|
283
|
+
private
|
284
|
+
|
250
285
|
def definition_target
|
251
286
|
object_singleton_class
|
252
287
|
end
|
253
288
|
|
254
289
|
end
|
290
|
+
|
291
|
+
private
|
292
|
+
|
293
|
+
def remove_method_from_definition_target
|
294
|
+
definition_target.__send__(:remove_method, @method_name)
|
295
|
+
rescue NameError
|
296
|
+
# This can happen when the method has been monkeyed with by
|
297
|
+
# something outside RSpec. This happens, for example, when
|
298
|
+
# `file.write` has been stubbed, and then `file.reopen(other_io)`
|
299
|
+
# is later called, as `File#reopen` appears to redefine `write`.
|
300
|
+
#
|
301
|
+
# Note: we could avoid rescuing this by checking
|
302
|
+
# `definition_target.instance_method(@method_name).owner == definition_target`,
|
303
|
+
# saving us from the cost of the expensive exception, but this error is
|
304
|
+
# extremely rare (it was discovered on 2014-12-30, only happens on
|
305
|
+
# RUBY_VERSION < 2.0 and our spec suite only hits this condition once),
|
306
|
+
# so we'd rather avoid the cost of that check for every method double,
|
307
|
+
# and risk the rare situation where this exception will get raised.
|
308
|
+
RSpec.warn_with(
|
309
|
+
"WARNING: RSpec could not fully restore #{@object.inspect}." \
|
310
|
+
"#{@method_name}, possibly because the method has been redefined " \
|
311
|
+
"by something outside of RSpec."
|
312
|
+
)
|
313
|
+
end
|
255
314
|
end
|
256
315
|
end
|
257
316
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
RSpec::Support.require_rspec_support 'comparable_version'
|
2
|
+
|
1
3
|
module RSpec
|
2
4
|
module Mocks
|
3
5
|
# Represents a method on an object that may or may not be defined.
|
@@ -6,6 +8,10 @@ module RSpec
|
|
6
8
|
#
|
7
9
|
# @private
|
8
10
|
class MethodReference
|
11
|
+
def self.for(object_reference, method_name)
|
12
|
+
new(object_reference, method_name)
|
13
|
+
end
|
14
|
+
|
9
15
|
def initialize(object_reference, method_name)
|
10
16
|
@object_reference = object_reference
|
11
17
|
@method_name = method_name
|
@@ -27,7 +33,7 @@ module RSpec
|
|
27
33
|
# cases when we don't know if a method is implemented and
|
28
34
|
# both `implemented?` and `unimplemented?` will return false.
|
29
35
|
def unimplemented?
|
30
|
-
@object_reference.when_loaded do |
|
36
|
+
@object_reference.when_loaded do |_m|
|
31
37
|
return !implemented?
|
32
38
|
end
|
33
39
|
|
@@ -44,9 +50,8 @@ module RSpec
|
|
44
50
|
end
|
45
51
|
|
46
52
|
def with_signature
|
47
|
-
|
48
|
-
|
49
|
-
end
|
53
|
+
return unless (original = original_method)
|
54
|
+
yield Support::MethodSignature.new(original)
|
50
55
|
end
|
51
56
|
|
52
57
|
def visibility
|
@@ -59,14 +64,6 @@ module RSpec
|
|
59
64
|
:public
|
60
65
|
end
|
61
66
|
|
62
|
-
private
|
63
|
-
|
64
|
-
def original_method
|
65
|
-
@object_reference.when_loaded do |m|
|
66
|
-
self.defined? && find_method(m)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
67
|
def self.instance_method_visibility_for(klass, method_name)
|
71
68
|
if klass.public_method_defined?(method_name)
|
72
69
|
:public
|
@@ -82,23 +79,40 @@ module RSpec
|
|
82
79
|
end
|
83
80
|
|
84
81
|
def self.method_visibility_for(object, method_name)
|
85
|
-
instance_method_visibility_for(class << object; self; end, method_name)
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
82
|
+
vis = instance_method_visibility_for(class << object; self; end, method_name)
|
83
|
+
|
84
|
+
# If the method is not defined on the class, `instance_method_visibility_for`
|
85
|
+
# returns `nil`. However, it may be handled dynamically by `method_missing`,
|
86
|
+
# so here we check `respond_to` (passing false to not check private methods).
|
87
|
+
#
|
88
|
+
# This only considers the public case, but I don't think it's possible to
|
89
|
+
# write `method_missing` in such a way that it handles a dynamic message
|
90
|
+
# with private or protected visibility. Ruby doesn't provide you with
|
91
|
+
# the caller info.
|
92
|
+
return vis unless vis.nil?
|
93
|
+
|
94
|
+
proxy = RSpec::Mocks.space.proxy_for(object)
|
95
|
+
respond_to = proxy.method_double_if_exists_for_message(:respond_to?)
|
96
|
+
|
97
|
+
visible = respond_to && respond_to.original_method.call(method_name) ||
|
98
|
+
object.respond_to?(method_name)
|
99
|
+
|
100
|
+
return :public if visible
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def original_method
|
106
|
+
@object_reference.when_loaded do |m|
|
107
|
+
self.defined? && find_method(m)
|
95
108
|
end
|
96
109
|
end
|
97
110
|
end
|
98
111
|
|
99
112
|
# @private
|
100
113
|
class InstanceMethodReference < MethodReference
|
101
|
-
|
114
|
+
private
|
115
|
+
|
102
116
|
def method_implemented?(mod)
|
103
117
|
MethodReference.method_defined_at_any_visibility?(mod, @method_name)
|
104
118
|
end
|
@@ -116,7 +130,7 @@ module RSpec
|
|
116
130
|
#
|
117
131
|
# This is necessary due to a bug in JRuby prior to 1.7.5 fixed in:
|
118
132
|
# https://github.com/jruby/jruby/commit/99a0613fe29935150d76a9a1ee4cf2b4f63f4a27
|
119
|
-
if RUBY_PLATFORM == 'java' &&
|
133
|
+
if RUBY_PLATFORM == 'java' && RSpec::Support::ComparableVersion.new(JRUBY_VERSION) < '1.7.5'
|
120
134
|
def find_method(mod)
|
121
135
|
mod.dup.instance_method(@method_name)
|
122
136
|
end
|
@@ -133,7 +147,16 @@ module RSpec
|
|
133
147
|
|
134
148
|
# @private
|
135
149
|
class ObjectMethodReference < MethodReference
|
136
|
-
|
150
|
+
def self.for(object_reference, method_name)
|
151
|
+
if ClassNewMethodReference.applies_to?(method_name) { object_reference.when_loaded { |o| o } }
|
152
|
+
ClassNewMethodReference.new(object_reference, method_name)
|
153
|
+
else
|
154
|
+
super
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
private
|
159
|
+
|
137
160
|
def method_implemented?(object)
|
138
161
|
object.respond_to?(@method_name, true)
|
139
162
|
end
|
@@ -150,5 +173,42 @@ module RSpec
|
|
150
173
|
MethodReference.method_visibility_for(object, @method_name)
|
151
174
|
end
|
152
175
|
end
|
176
|
+
|
177
|
+
# When a class's `.new` method is stubbed, we want to use the method
|
178
|
+
# signature from `#initialize` because `.new`'s signature is a generic
|
179
|
+
# `def new(*args)` and it simply delegates to `#initialize` and forwards
|
180
|
+
# all args...so the method with the actually used signature is `#initialize`.
|
181
|
+
#
|
182
|
+
# This method reference implementation handles that specific case.
|
183
|
+
# @private
|
184
|
+
class ClassNewMethodReference < ObjectMethodReference
|
185
|
+
def self.applies_to?(method_name)
|
186
|
+
return false unless method_name == :new
|
187
|
+
klass = yield
|
188
|
+
return false unless ::Class === klass && klass.respond_to?(:new, true)
|
189
|
+
|
190
|
+
# We only want to apply our special logic to normal `new` methods.
|
191
|
+
# Methods that the user has monkeyed with should be left as-is.
|
192
|
+
uses_class_new?(klass)
|
193
|
+
end
|
194
|
+
|
195
|
+
if RUBY_VERSION.to_i >= 3
|
196
|
+
CLASS_NEW = ::Class.instance_method(:new)
|
197
|
+
|
198
|
+
def self.uses_class_new?(klass)
|
199
|
+
::RSpec::Support.method_handle_for(klass, :new) == CLASS_NEW.bind(klass)
|
200
|
+
end
|
201
|
+
else # Ruby 2's Method#== is too strict
|
202
|
+
def self.uses_class_new?(klass)
|
203
|
+
::RSpec::Support.method_handle_for(klass, :new).owner == ::Class
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
def with_signature
|
208
|
+
@object_reference.when_loaded do |klass|
|
209
|
+
yield Support::MethodSignature.new(klass.instance_method(:initialize))
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
153
213
|
end
|
154
214
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'rspec/mocks'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Mocks
|
5
|
+
# @private
|
6
|
+
module MinitestIntegration
|
7
|
+
include ::RSpec::Mocks::ExampleMethods
|
8
|
+
|
9
|
+
def before_setup
|
10
|
+
::RSpec::Mocks.setup
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def after_teardown
|
15
|
+
super
|
16
|
+
|
17
|
+
# Only verify if there's not already an error. Otherwise
|
18
|
+
# we risk getting the same failure twice, since negative
|
19
|
+
# expectation violations raise both when the message is
|
20
|
+
# unexpectedly received, and also during `verify` (in case
|
21
|
+
# the first failure was caught by user code via a
|
22
|
+
# `rescue Exception`).
|
23
|
+
::RSpec::Mocks.verify unless failures.any?
|
24
|
+
ensure
|
25
|
+
::RSpec::Mocks.teardown
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Minitest::Test.send(:include, RSpec::Mocks::MinitestIntegration)
|
32
|
+
|
33
|
+
if defined?(::Minitest::Expectation)
|
34
|
+
if defined?(::RSpec::Expectations) && ::Minitest::Expectation.method_defined?(:to)
|
35
|
+
# rspec/expectations/minitest_integration has already been loaded and
|
36
|
+
# has defined `to`/`not_to`/`to_not` on `Minitest::Expectation` so we do
|
37
|
+
# not want to here (or else we would interfere with rspec-expectations' definition).
|
38
|
+
else
|
39
|
+
# ...otherwise, define those methods now. If `rspec/expectations/minitest_integration`
|
40
|
+
# is loaded after this file, it'll override the definition here.
|
41
|
+
Minitest::Expectation.class_eval do
|
42
|
+
include RSpec::Mocks::ExpectationTargetMethods
|
43
|
+
|
44
|
+
def to(*args)
|
45
|
+
ctx.assertions += 1
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
49
|
+
def not_to(*args)
|
50
|
+
ctx.assertions += 1
|
51
|
+
super
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_not(*args)
|
55
|
+
ctx.assertions += 1
|
56
|
+
super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
module RSpec
|
63
|
+
module Mocks
|
64
|
+
remove_const :MockExpectationError
|
65
|
+
# Raised when a message expectation is not satisfied.
|
66
|
+
MockExpectationError = ::Minitest::Assertion
|
67
|
+
end
|
68
|
+
end
|