rspec-mocks-diag 3.8.1.2 → 3.9.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +25 -0
- data/README.md +4 -1
- data/lib/rspec/mocks/any_instance/chain.rb +1 -0
- data/lib/rspec/mocks/any_instance/error_generator.rb +2 -10
- data/lib/rspec/mocks/any_instance/recorder.rb +6 -6
- data/lib/rspec/mocks/argument_matchers.rb +2 -0
- data/lib/rspec/mocks/error_generator.rb +1 -1
- data/lib/rspec/mocks/matchers/have_received.rb +1 -1
- data/lib/rspec/mocks/message_expectation.rb +12 -2
- data/lib/rspec/mocks/proxy.rb +33 -15
- data/lib/rspec/mocks/test_double.rb +0 -10
- data/lib/rspec/mocks/version.rb +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8be35928033a695ee980bc47fffc4e52e3bfaae18bece60c4fdb928ae49d28b0
|
4
|
+
data.tar.gz: 8a477839418aab6661b7eb23bd150f08ece8015a98b641b2387e2e4582f6b52d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 222f5305d179ae0c5326badad390c06121c47cf143984501b7cbd3d8e7e1c15a7d255d92c0cb26716709e32d92896e0dda9c5eb6cb006c0a7f24f0fe2e2829f3
|
7
|
+
data.tar.gz: 3c790d7f0b638fff260179b35f931bf6c28951a0a0faef3797dfc2a78b66fffe086af30cd6d379ea758ad2fcc7ed10728ff7bffea06136bc5614973f78384e95
|
data/Changelog.md
CHANGED
@@ -1,3 +1,28 @@
|
|
1
|
+
### 3.9.1 / 2019-12-31
|
2
|
+
[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.9.0...v3.9.1)
|
3
|
+
|
4
|
+
Bug Fixes:
|
5
|
+
|
6
|
+
* Trigger `RSpec::Mocks.configuration.verifying_double_callbacks` when using
|
7
|
+
`allow_any_instance_of` or `expect_any_instance_of` (Daniel Orner, #1309)
|
8
|
+
|
9
|
+
### 3.9.0 / 2019-10-07
|
10
|
+
[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.2...v3.9.0)
|
11
|
+
|
12
|
+
Enhancements:
|
13
|
+
|
14
|
+
* Improve thread safety of message expectations by using Mutex to prevent
|
15
|
+
deadlocking errors. (Ry Biesemeyer, #1236)
|
16
|
+
* Add the ability to use `time` as an alias for `times`. For example:
|
17
|
+
`expect(Class).to receive(:method).exactly(1).time`.
|
18
|
+
(Pistos, Benoit Tigeot, #1271)
|
19
|
+
|
20
|
+
### 3.8.2 / 2019-10-02
|
21
|
+
[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.1...v3.8.2)
|
22
|
+
|
23
|
+
* Allow `array_including` argument matchers to be nested.
|
24
|
+
(Emmanuel Delmas, #1291)
|
25
|
+
|
1
26
|
### 3.8.1 / 2019-06-13
|
2
27
|
[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.0...v3.8.1)
|
3
28
|
|
data/README.md
CHANGED
@@ -285,12 +285,15 @@ expect(double).to receive(:msg).with(hash_excluding(:a => 5)) # first arg is a h
|
|
285
285
|
```ruby
|
286
286
|
expect(double).to receive(:msg).once
|
287
287
|
expect(double).to receive(:msg).twice
|
288
|
+
expect(double).to receive(:msg).exactly(n).time
|
288
289
|
expect(double).to receive(:msg).exactly(n).times
|
289
290
|
expect(double).to receive(:msg).at_least(:once)
|
290
291
|
expect(double).to receive(:msg).at_least(:twice)
|
292
|
+
expect(double).to receive(:msg).at_least(n).time
|
291
293
|
expect(double).to receive(:msg).at_least(n).times
|
292
294
|
expect(double).to receive(:msg).at_most(:once)
|
293
295
|
expect(double).to receive(:msg).at_most(:twice)
|
296
|
+
expect(double).to receive(:msg).at_most(n).time
|
294
297
|
expect(double).to receive(:msg).at_most(n).times
|
295
298
|
```
|
296
299
|
|
@@ -327,7 +330,7 @@ expect(double).to receive(:msg).and_return(value)
|
|
327
330
|
expect(double).to receive(:msg).exactly(3).times.and_return(value1, value2, value3)
|
328
331
|
# returns value1 the first time, value2 the second, etc
|
329
332
|
expect(double).to receive(:msg).and_raise(error)
|
330
|
-
# error can be an instantiated object or a class
|
333
|
+
# `error` can be an instantiated object (e.g. `StandardError.new(some_arg)`) or a class (e.g. `StandardError`)
|
331
334
|
# if it is a class, it must be instantiable with no args
|
332
335
|
expect(double).to receive(:msg).and_throw(:msg)
|
333
336
|
expect(double).to receive(:msg).and_yield(values, to, yield)
|
@@ -12,17 +12,9 @@ module RSpec
|
|
12
12
|
__raise "#{klass} does not implement ##{method_name}"
|
13
13
|
end
|
14
14
|
|
15
|
-
def raise_message_already_received_by_other_instance_error(method_name, object_inspect, invoked_instance
|
16
|
-
begin
|
17
|
-
raise RuntimeError
|
18
|
-
rescue => e
|
19
|
-
backtrace = e.backtrace
|
20
|
-
end
|
15
|
+
def raise_message_already_received_by_other_instance_error(method_name, object_inspect, invoked_instance)
|
21
16
|
__raise "The message '#{method_name}' was received by #{object_inspect} " \
|
22
|
-
"but has already been received by #{invoked_instance}
|
23
|
-
backtrace.map { |line| ' ' + line }.join("\n") +
|
24
|
-
"\nPrevious backtrace: \n" +
|
25
|
-
invoked_backtrace.map { |line| ' ' + line }.join("\n")
|
17
|
+
"but has already been received by #{invoked_instance}"
|
26
18
|
end
|
27
19
|
|
28
20
|
def raise_not_supported_with_prepend_error(method_name, problem_mod)
|
@@ -21,6 +21,11 @@ module RSpec
|
|
21
21
|
@backed_up_method_owner = {}
|
22
22
|
@klass = klass
|
23
23
|
@expectation_set = false
|
24
|
+
|
25
|
+
return unless RSpec::Mocks.configuration.verify_partial_doubles?
|
26
|
+
RSpec::Mocks.configuration.verifying_double_callbacks.each do |block|
|
27
|
+
block.call(ObjectReference.for(klass))
|
28
|
+
end
|
24
29
|
end
|
25
30
|
|
26
31
|
# Initializes the recording a stub to be played back against any
|
@@ -261,16 +266,11 @@ module RSpec
|
|
261
266
|
def mark_invoked!(method_name)
|
262
267
|
backup_method!(method_name)
|
263
268
|
recorder = self
|
264
|
-
begin
|
265
|
-
raise RuntimeError
|
266
|
-
rescue => e
|
267
|
-
invoked_backtrace = e.backtrace
|
268
|
-
end
|
269
269
|
@klass.__send__(:define_method, method_name) do |*_args, &_blk|
|
270
270
|
invoked_instance = recorder.instance_that_received(method_name)
|
271
271
|
inspect = "#<#{self.class}:#{object_id} #{instance_variables.map { |name| "#{name}=#{instance_variable_get name}" }.join(', ')}>"
|
272
272
|
AnyInstance.error_generator.raise_message_already_received_by_other_instance_error(
|
273
|
-
method_name, inspect, invoked_instance
|
273
|
+
method_name, inspect, invoked_instance
|
274
274
|
)
|
275
275
|
end
|
276
276
|
end
|
@@ -47,7 +47,7 @@ module RSpec
|
|
47
47
|
|
48
48
|
# @private
|
49
49
|
def raise_unexpected_message_error(message, args)
|
50
|
-
__raise "#{intro} received unexpected message :#{message} with #{format_args(args)}
|
50
|
+
__raise "#{intro} received unexpected message :#{message} with #{format_args(args)}"
|
51
51
|
end
|
52
52
|
|
53
53
|
# @private
|
@@ -5,7 +5,7 @@ module RSpec
|
|
5
5
|
class HaveReceived
|
6
6
|
include Matcher
|
7
7
|
|
8
|
-
COUNT_CONSTRAINTS = %w[exactly at_least at_most times once twice thrice]
|
8
|
+
COUNT_CONSTRAINTS = %w[exactly at_least at_most times time once twice thrice]
|
9
9
|
ARGS_CONSTRAINTS = %w[with]
|
10
10
|
CONSTRAINTS = COUNT_CONSTRAINTS + ARGS_CONSTRAINTS + %w[ordered]
|
11
11
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
RSpec::Support.require_rspec_support 'mutex'
|
2
|
+
|
1
3
|
module RSpec
|
2
4
|
module Mocks
|
3
5
|
# A message expectation that only allows concrete return values to be set
|
@@ -236,6 +238,7 @@ module RSpec
|
|
236
238
|
self.inner_implementation_action = block
|
237
239
|
self
|
238
240
|
end
|
241
|
+
alias time times
|
239
242
|
|
240
243
|
# Expect a message not to be received at all.
|
241
244
|
#
|
@@ -357,6 +360,7 @@ module RSpec
|
|
357
360
|
# some collaborators it delegates to for this stuff but for now this was
|
358
361
|
# the simplest way to split the public from private stuff to make it
|
359
362
|
# easier to publish the docs for the APIs we want published.
|
363
|
+
# rubocop:disable Metrics/ModuleLength
|
360
364
|
module ImplementationDetails
|
361
365
|
attr_accessor :error_generator, :implementation
|
362
366
|
attr_reader :message
|
@@ -378,6 +382,7 @@ module RSpec
|
|
378
382
|
@orig_object = @method_double.object
|
379
383
|
@message = @method_double.method_name
|
380
384
|
@actual_received_count = 0
|
385
|
+
@actual_received_count_write_mutex = Support::Mutex.new
|
381
386
|
@expected_received_count = type == :expectation ? 1 : :any
|
382
387
|
@argument_list_matcher = ArgumentListMatcher::MATCH_ALL
|
383
388
|
@order_group = expectation_ordering
|
@@ -543,7 +548,9 @@ module RSpec
|
|
543
548
|
end
|
544
549
|
|
545
550
|
def increase_actual_received_count!
|
546
|
-
@
|
551
|
+
@actual_received_count_write_mutex.synchronize do
|
552
|
+
@actual_received_count += 1
|
553
|
+
end
|
547
554
|
end
|
548
555
|
|
549
556
|
private
|
@@ -574,7 +581,9 @@ module RSpec
|
|
574
581
|
parent_stub.invoke(nil, *args, &block)
|
575
582
|
end
|
576
583
|
ensure
|
577
|
-
@
|
584
|
+
@actual_received_count_write_mutex.synchronize do
|
585
|
+
@actual_received_count += increment
|
586
|
+
end
|
578
587
|
end
|
579
588
|
|
580
589
|
def has_been_invoked?
|
@@ -633,6 +642,7 @@ module RSpec
|
|
633
642
|
nil
|
634
643
|
end
|
635
644
|
end
|
645
|
+
# rubocop:enable Metrics/ModuleLength
|
636
646
|
|
637
647
|
include ImplementationDetails
|
638
648
|
end
|
data/lib/rspec/mocks/proxy.rb
CHANGED
@@ -9,6 +9,11 @@ module RSpec
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
unless defined?(Mutex)
|
13
|
+
Support.require_rspec_support 'mutex'
|
14
|
+
Mutex = Support::Mutex
|
15
|
+
end
|
16
|
+
|
12
17
|
# @private
|
13
18
|
def ensure_implemented(*_args)
|
14
19
|
# noop for basic proxies, see VerifyingProxy for behaviour.
|
@@ -20,6 +25,7 @@ module RSpec
|
|
20
25
|
@order_group = order_group
|
21
26
|
@error_generator = ErrorGenerator.new(object)
|
22
27
|
@messages_received = []
|
28
|
+
@messages_received_mutex = Mutex.new
|
23
29
|
@options = options
|
24
30
|
@null_object = false
|
25
31
|
@method_doubles = Hash.new { |h, k| h[k] = MethodDouble.new(@object, k, self) }
|
@@ -90,27 +96,31 @@ module RSpec
|
|
90
96
|
@error_generator.raise_expectation_on_unstubbed_method(expected_method_name)
|
91
97
|
end
|
92
98
|
|
93
|
-
@
|
94
|
-
|
99
|
+
@messages_received_mutex.synchronize do
|
100
|
+
@messages_received.each do |(actual_method_name, args, received_block)|
|
101
|
+
next unless expectation.matches?(actual_method_name, *args)
|
95
102
|
|
96
|
-
|
97
|
-
|
103
|
+
expectation.safe_invoke(nil)
|
104
|
+
block.call(*args, &received_block) if block
|
105
|
+
end
|
98
106
|
end
|
99
107
|
end
|
100
108
|
|
101
109
|
# @private
|
102
110
|
def check_for_unexpected_arguments(expectation)
|
103
|
-
|
111
|
+
@messages_received_mutex.synchronize do
|
112
|
+
return if @messages_received.empty?
|
104
113
|
|
105
|
-
|
114
|
+
return if @messages_received.any? { |method_name, args, _| expectation.matches?(method_name, *args) }
|
106
115
|
|
107
|
-
|
108
|
-
|
109
|
-
|
116
|
+
name_but_not_args, others = @messages_received.partition do |(method_name, args, _)|
|
117
|
+
expectation.matches_name_but_not_args(method_name, *args)
|
118
|
+
end
|
110
119
|
|
111
|
-
|
120
|
+
return if name_but_not_args.empty? && !others.empty?
|
112
121
|
|
113
|
-
|
122
|
+
expectation.raise_unexpected_message_args_error(name_but_not_args.map { |args| args[1] })
|
123
|
+
end
|
114
124
|
end
|
115
125
|
|
116
126
|
# @private
|
@@ -141,17 +151,23 @@ module RSpec
|
|
141
151
|
|
142
152
|
# @private
|
143
153
|
def reset
|
144
|
-
@
|
154
|
+
@messages_received_mutex.synchronize do
|
155
|
+
@messages_received.clear
|
156
|
+
end
|
145
157
|
end
|
146
158
|
|
147
159
|
# @private
|
148
160
|
def received_message?(method_name, *args, &block)
|
149
|
-
@
|
161
|
+
@messages_received_mutex.synchronize do
|
162
|
+
@messages_received.any? { |array| array == [method_name, args, block] }
|
163
|
+
end
|
150
164
|
end
|
151
165
|
|
152
166
|
# @private
|
153
167
|
def messages_arg_list
|
154
|
-
@
|
168
|
+
@messages_received_mutex.synchronize do
|
169
|
+
@messages_received.map { |_, args, _| args }
|
170
|
+
end
|
155
171
|
end
|
156
172
|
|
157
173
|
# @private
|
@@ -162,7 +178,9 @@ module RSpec
|
|
162
178
|
# @private
|
163
179
|
def record_message_received(message, *args, &block)
|
164
180
|
@order_group.invoked SpecificMessage.new(object, message, args)
|
165
|
-
@
|
181
|
+
@messages_received_mutex.synchronize do
|
182
|
+
@messages_received << [message, args, block]
|
183
|
+
end
|
166
184
|
end
|
167
185
|
|
168
186
|
# @private
|
@@ -15,18 +15,8 @@ module RSpec
|
|
15
15
|
@name = name
|
16
16
|
end
|
17
17
|
assign_stubs(stubs)
|
18
|
-
|
19
|
-
begin
|
20
|
-
raise RuntimeError
|
21
|
-
rescue => e
|
22
|
-
@_rspec_backtrace = e.backtrace.dup.tap do |bt|
|
23
|
-
bt.shift
|
24
|
-
end
|
25
|
-
end
|
26
18
|
end
|
27
19
|
|
28
|
-
attr_reader :_rspec_backtrace
|
29
|
-
|
30
20
|
# Tells the object to respond to all messages. If specific stub values
|
31
21
|
# are declared, they'll work as expected. If not, the receiver is
|
32
22
|
# returned.
|
data/lib/rspec/mocks/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-mocks-diag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.9.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Baker
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-01-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec-support
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 3.
|
21
|
+
version: 3.9.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 3.
|
28
|
+
version: 3.9.0
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: diff-lcs
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,14 +80,14 @@ dependencies:
|
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: 0.
|
83
|
+
version: 0.14.10
|
84
84
|
type: :development
|
85
85
|
prerelease: false
|
86
86
|
version_requirements: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
88
|
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: 0.
|
90
|
+
version: 0.14.10
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: minitest
|
93
93
|
requirement: !ruby/object:Gem::Requirement
|
@@ -159,7 +159,7 @@ licenses:
|
|
159
159
|
- MIT
|
160
160
|
metadata:
|
161
161
|
bug_tracker_uri: https://github.com/p-mongo/rspec-mocks/issues
|
162
|
-
changelog_uri: https://github.com/p-mongo/rspec-mocks/blob/v3.
|
162
|
+
changelog_uri: https://github.com/p-mongo/rspec-mocks/blob/v3.9.1.1/Changelog.md
|
163
163
|
documentation_uri: https://rspec.info/documentation/
|
164
164
|
mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
|
165
165
|
source_code_uri: https://github.com/p-mongo/rspec-mocks
|
@@ -179,8 +179,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
181
|
requirements: []
|
182
|
-
rubygems_version: 3.
|
182
|
+
rubygems_version: 3.1.2
|
183
183
|
signing_key:
|
184
184
|
specification_version: 4
|
185
|
-
summary: rspec-mocks-3.
|
185
|
+
summary: rspec-mocks-3.9.1.1
|
186
186
|
test_files: []
|