rspec-mocks 3.0.0 → 3.1.0

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 (39) hide show
  1. checksums.yaml +6 -14
  2. checksums.yaml.gz.sig +0 -0
  3. data/Changelog.md +89 -1
  4. data/README.md +32 -18
  5. data/lib/rspec/mocks/any_instance/chain.rb +2 -2
  6. data/lib/rspec/mocks/any_instance/expectation_chain.rb +2 -3
  7. data/lib/rspec/mocks/any_instance/message_chains.rb +8 -7
  8. data/lib/rspec/mocks/any_instance/proxy.rb +7 -3
  9. data/lib/rspec/mocks/any_instance/recorder.rb +27 -25
  10. data/lib/rspec/mocks/any_instance/stub_chain.rb +3 -5
  11. data/lib/rspec/mocks/argument_list_matcher.rb +4 -4
  12. data/lib/rspec/mocks/argument_matchers.rb +39 -6
  13. data/lib/rspec/mocks/configuration.rb +4 -11
  14. data/lib/rspec/mocks/error_generator.rb +33 -27
  15. data/lib/rspec/mocks/example_methods.rb +75 -7
  16. data/lib/rspec/mocks/instance_method_stasher.rb +5 -5
  17. data/lib/rspec/mocks/matchers/have_received.rb +10 -8
  18. data/lib/rspec/mocks/matchers/receive.rb +8 -8
  19. data/lib/rspec/mocks/matchers/receive_message_chain.rb +5 -6
  20. data/lib/rspec/mocks/matchers/receive_messages.rb +6 -7
  21. data/lib/rspec/mocks/message_chain.rb +5 -5
  22. data/lib/rspec/mocks/message_expectation.rb +66 -27
  23. data/lib/rspec/mocks/method_double.rb +15 -12
  24. data/lib/rspec/mocks/method_reference.rb +8 -7
  25. data/lib/rspec/mocks/mutate_const.rb +26 -100
  26. data/lib/rspec/mocks/object_reference.rb +12 -13
  27. data/lib/rspec/mocks/order_group.rb +4 -5
  28. data/lib/rspec/mocks/proxy.rb +35 -24
  29. data/lib/rspec/mocks/space.rb +25 -25
  30. data/lib/rspec/mocks/syntax.rb +101 -99
  31. data/lib/rspec/mocks/targets.rb +6 -6
  32. data/lib/rspec/mocks/test_double.rb +13 -4
  33. data/lib/rspec/mocks/verifying_double.rb +16 -16
  34. data/lib/rspec/mocks/verifying_message_expecation.rb +15 -13
  35. data/lib/rspec/mocks/verifying_proxy.rb +12 -16
  36. data/lib/rspec/mocks/version.rb +1 -1
  37. data.tar.gz.sig +0 -0
  38. metadata +61 -54
  39. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NGVjNjIxMDkzYzYzOGM1NTJlY2NlNmU4NDU4MzFiMDg5ZDkwODRmZA==
5
- data.tar.gz: !binary |-
6
- MmY5NWExM2FkYmFlNWQxOWU3ZmZiZjQzYmY2ZTI1MjRmNjNlYWZhMA==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- MzhiNTZkYzg1ZjZhN2Y2NGU3ZTRkOGQwNWNiZmUzNzc0NzEyODZmN2UxMjY5
10
- NmYwODNhZGNiNGZmNWM5YzBkYzY5NDU4YWRiZTFhODhiNTVmMTVjNjNjNDA4
11
- ODVjZjRjNTQzNGUwOWM1Y2NiMTY1MDdjYWUxMmNmMDc3NWQwZmI=
12
- data.tar.gz: !binary |-
13
- NDQ0MDBhZDE0NzkyNzRjODFjNmZiOWExNzU3NWJmZjU4ZTFhMzAyYzlkNTk0
14
- ZDIxNjZhODk0ODI2MjY1OTFkNTljYTk0N2ZkMDBhNTcwNTk5MTc1Yzg1MDhj
15
- ZTczN2Q2M2I3YjgxNTg4YzhiM2FmMzliZGNiM2MxNTE4OTJhYjE=
2
+ SHA1:
3
+ metadata.gz: 16d5f671e68051be014fb930e9980f5a0c19d5ee
4
+ data.tar.gz: b035e939d0afc695e7b03485f1edc2356c5b0bc0
5
+ SHA512:
6
+ metadata.gz: 46ba65b5222400961866c699044adba07374c0a2c241e2f011e2eb55b8fdfc3c167db0f371a925a06704ac6d209e1400a1802c45d94ea25ae38142bcf396c9bc
7
+ data.tar.gz: 617ae574ebe247f7b2ee1c6a45a94fb200006b56dd8c98ec536d655622a85749e0a10985e491e47709a744ebc450d494d591b5367c91bd89cc3f0001e6f95c9b
checksums.yaml.gz.sig CHANGED
Binary file
data/Changelog.md CHANGED
@@ -1,3 +1,71 @@
1
+ ### 3.1.0 / 2014-09-04
2
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.4...v3.1.0)
3
+
4
+ Enhancements:
5
+
6
+ * Add spying methods (`spy`, `ìnstance_spy`, `class_spy` and `object_spy`)
7
+ which create doubles as null objects for use with spying in testing. (Sam
8
+ Phippen, #671)
9
+ * `have_received` matcher will raise "does not implement" errors correctly when
10
+ used with verifying doubles and partial doubles. (Xavier Shay, #722)
11
+ * Allow matchers to be used in place of keyword arguments in `with`
12
+ expectations. (Xavier Shay, #726)
13
+ * Add `thrice` modifier to message expectation interface as a synonym
14
+ for `exactly(3).times`. (Dennis Taylor, #753)
15
+ * Add more `thrice` synonyms e.g. `.at_least(:thrice)`, `.at_most(:thrice)`,
16
+ `receive(...).thrice` and `have_received(...).thrice`. (Jon Rowe, #754)
17
+ * Add `and_wrap_original` modifier for partial doubles to mutate the
18
+ response from a method. (Jon Rowe, #762)
19
+
20
+ Bugfixes:
21
+
22
+ * Remove `any_number_of_times` from `any_instance` recorders that were
23
+ erroneously causing mention of the method in documentation. (Jon Rowe, #760)
24
+ * Prevent included modules being detected as prepended modules on Ruby 2.0.
25
+ (Eugene Kenny, #771)
26
+
27
+ ### 3.0.4 / 2014-08-14
28
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.3...v3.0.4)
29
+
30
+ Bug Fixes:
31
+
32
+ * Restore `kind_of(x)` to match using `arg.kind_of?(x)` (like RSpec 2)
33
+ rather than `x === arg`. (Jon Rowe, #750)
34
+
35
+ ### 3.0.3 / 2014-07-21
36
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.2...v3.0.3)
37
+
38
+ Bug Fixes:
39
+
40
+ * `have_received` matcher will raise "does not implement" errors correctly when
41
+ used with verifying doubles and partial doubles. (Xavier Shay, #722)
42
+ * Make `double.as_null_object.dup` and `double.as_null_object.clone`
43
+ make the copies be null objects. (Myron Marston, #732)
44
+ * Don't inadvertently define `BasicObject` in 1.8.7. (Chris Griego, #739)
45
+
46
+ ### 3.0.2 / 2014-06-19
47
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.1...v3.0.2)
48
+
49
+ Bug Fixes:
50
+
51
+ * Fix edge case that triggered "can't add a new key into hash during
52
+ iteration" during mock verification. (Sam Phippen, Myron Marston, #711)
53
+ * Fix verifying doubles so that when they accidentally leak into another
54
+ example, they provide the same clear error message that normal doubles
55
+ do. (Myron Marston, #718)
56
+ * Make `ordered` work with exact receive counts. (Sam Phippen, #713)
57
+
58
+ ### 3.0.1 / 2014-06-07
59
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0...v3.0.1)
60
+
61
+ Bug Fixes:
62
+
63
+ * Fix `receive_message_chain(...)` so that it supports `with` just like
64
+ `stub_chain` did. (Jon Rowe, #697)
65
+ * Fix regression in `expect_any_instance_of` so that it expects the
66
+ message on _any_ instance rather than on _every_ instance.
67
+ (Myron Marston, #699)
68
+
1
69
  ### 3.0.0 / 2014-06-01
2
70
  [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.rc1...v3.0.0)
3
71
 
@@ -141,7 +209,7 @@ Bug Fixes:
141
209
  behavior. (Maurício Linhares)
142
210
 
143
211
  ### 3.0.0.beta1 / 2013-11-07
144
- [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0...v3.0.0.beta1)
212
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.2...v3.0.0.beta1)
145
213
 
146
214
  Breaking Changes for 3.0.0:
147
215
 
@@ -204,6 +272,26 @@ Bug Fixes:
204
272
  returns `nil` or `''` so that you still get a useful message.
205
273
  (Nick DeLuca)
206
274
 
275
+ ### 2.99.2 / 2014-07-21
276
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.1...v2.99.2)
277
+
278
+ Enhancements:
279
+
280
+ * Warn about upcoming change to `#===` matching and `DateTime#===` behaviour.
281
+ (Jon Rowe, #735)
282
+
283
+ ### 2.99.1 / 2014-06-12
284
+ [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0...v2.99.1)
285
+
286
+ Bug Fixes:
287
+
288
+ * Fix bug that caused errors at the end of each example
289
+ when a `double.as_null_object` had been frozen. (Yuji Nakayama, #698)
290
+
291
+ Deprecations:
292
+
293
+ * Deprecate freezing a test double. (Yuji Nakayama, #698)
294
+
207
295
  ### 2.99.0 / 2014-06-01
208
296
  [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.rc1...v2.99.0)
209
297
 
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- # RSpec Mocks [![Build Status](https://secure.travis-ci.org/rspec/rspec-mocks.png?branch=master)](http://travis-ci.org/rspec/rspec-mocks) [![Code Climate](https://codeclimate.com/github/rspec/rspec-mocks.png)](https://codeclimate.com/github/rspec/rspec-mocks) [![Inline docs](http://inch-pages.github.io/github/rspec/rspec-mocks.png)](http://inch-pages.github.io/github/rspec/rspec-mocks)
2
-
1
+ # RSpec Mocks [![Build Status](https://secure.travis-ci.org/rspec/rspec-mocks.png?branch=master)](http://travis-ci.org/rspec/rspec-mocks) [![Code Climate](https://codeclimate.com/github/rspec/rspec-mocks.png)](https://codeclimate.com/github/rspec/rspec-mocks)
3
2
  rspec-mocks is a test-double framework for rspec with support for method stubs,
4
3
  fakes, and message expectations on generated test-doubles and real objects
5
4
  alike.
@@ -102,24 +101,38 @@ zipcode.valid?
102
101
 
103
102
  ## Test Spies
104
103
 
105
- Verifies the given object received the expected message during the course of the
106
- test. The method must have previously been stubbed in order for messages to be
107
- verified.
104
+ Verifies the given object received the expected message during the course of
105
+ the test. For a message to be verified, the given object must be setup to spy
106
+ on it, either by having it explicitly stubbed or by being a null object double
107
+ (e.g. `double(...).as_null_object`). Convenience methods are provided to easily
108
+ create null object doubles for this purpose:
109
+
110
+ ```ruby
111
+ spy("invitation") # => same as `double("invitation").as_null_object`
112
+ instance_spy("Invitation") # => same as `instance_double("Invitation").as_null_object`
113
+ class_spy("Invitation") # => same as `class_double("Invitation").as_null_object`
114
+ object_spy("Invitation") # => same as `object_double("Invitation").as_null_object`
115
+ ```
108
116
 
109
117
  Stubbing and verifying messages received in this way implements the Test Spy
110
118
  pattern.
111
119
 
112
120
  ```ruby
113
- invitation = double('invitation', :accept => true)
121
+ invitation = spy('invitation')
122
+
123
+ user.accept_invitation(invitation)
114
124
 
115
- user.accept_invitation(invitation)
125
+ expect(invitation).to have_received(:accept)
116
126
 
117
- expect(invitation).to have_received(:accept)
127
+ # You can also use other common message expectations. For example:
128
+ expect(invitation).to have_received(:accept).with(mailer)
129
+ expect(invitation).to have_received(:accept).twice
130
+ expect(invitation).to_not have_received(:accept).with(mailer)
118
131
 
119
- # You can also use other common message expectations. For example:
120
- expect(invitation).to have_received(:accept).with(mailer)
121
- expect(invitation).to have_received(:accept).twice
122
- expect(invitation).to_not have_received(:accept).with(mailer)
132
+ # One can specify a return value on the spy the same way one would a double.
133
+ invitation = spy('invitation', :accept => true)
134
+ expect(invitation).to have_received(:accept).with(mailer)
135
+ expect(invitation.accept).to eq(true)
123
136
  ```
124
137
 
125
138
  ## Nomenclature
@@ -196,8 +209,10 @@ expect(double).to receive(:msg).with(1, kind_of(Numeric), "b") #2nd argument can
196
209
  expect(double).to receive(:msg).with(1, boolean(), "b") #2nd argument can be true or false
197
210
  expect(double).to receive(:msg).with(1, /abc/, "b") #2nd argument can be any String matching the submitted Regexp
198
211
  expect(double).to receive(:msg).with(1, anything(), "b") #2nd argument can be anything at all
199
- expect(double).to receive(:msg).with(1, duck_type(:abs, :div), "b")
200
- #2nd argument can be object that responds to #abs and #div
212
+ expect(double).to receive(:msg).with(1, duck_type(:abs, :div), "b") #2nd argument can be object that responds to #abs and #div
213
+ expect(double).to receive(:msg).with(hash_including(:a => 5)) # first arg is a hash with a: 5 as one of the key-values
214
+ expect(double).to receive(:msg).with(array_including(5)) # first arg is an array with 5 as one of the key-values
215
+ expect(double).to receive(:msg).with(hash_excluding(:a => 5)) # first arg is a hash without a: 5 as one of the key-values
201
216
  ```
202
217
 
203
218
  ## Receive Counts
@@ -212,7 +227,6 @@ expect(double).to receive(:msg).at_least(n).times
212
227
  expect(double).to receive(:msg).at_most(:once)
213
228
  expect(double).to receive(:msg).at_most(:twice)
214
229
  expect(double).to receive(:msg).at_most(n).times
215
- expect(double).to receive(:msg).any_number_of_times
216
230
  ```
217
231
 
218
232
  ## Ordering
@@ -334,7 +348,7 @@ Instead of `before(:context)`, use `before(:example)`.
334
348
 
335
349
  rspec-mocks provides two methods, `allow_any_instance_of` and
336
350
  `expect_any_instance_of`, that will allow you to stub or mock any instance
337
- of a class. They are used in place for `allow` or `expect`:
351
+ of a class. They are used in place of `allow` or `expect`:
338
352
 
339
353
  ```ruby
340
354
  allow_any_instance_of(Widget).to receive(:name).and_return("Wibble")
@@ -351,8 +365,8 @@ general we discourage its use for a number of reasons:
351
365
  feature operates on entire classes of objects. As a result there are some
352
366
  sematically confusing edge cases. For example in
353
367
  `expect_any_instance_of(Widget).to receive(:name).twice` it isn't clear
354
- whether each specific instance is allowed to receive `name` twice, or if two
355
- receives total are allowed. (It's the former.)
368
+ whether each specific instance is expected to receive `name` twice, or if two
369
+ receives total are expected. (It's the former.)
356
370
  * Using this feature is often a design smell. It may be
357
371
  that your test is trying to do too much or that the object under test is too
358
372
  complex.
@@ -37,7 +37,7 @@ module RSpec
37
37
  record :with
38
38
  record :once
39
39
  record :twice
40
- record :any_number_of_times
40
+ record :thrice
41
41
  record :exactly
42
42
  record :times
43
43
  record :never
@@ -84,7 +84,7 @@ module RSpec
84
84
  super
85
85
  end
86
86
 
87
- private
87
+ private
88
88
 
89
89
  def negated?
90
90
  messages.any? { |(message, *_), _| message == :never }
@@ -4,7 +4,7 @@ module RSpec
4
4
  # @private
5
5
  class ExpectationChain < Chain
6
6
  def expectation_fulfilled?
7
- @expectation_fulfilled || constrained_to_any_of?(:never, :any_number_of_times)
7
+ @expectation_fulfilled || constrained_to_any_of?(:never)
8
8
  end
9
9
 
10
10
  def initialize(*args, &block)
@@ -14,13 +14,12 @@ module RSpec
14
14
 
15
15
  private
16
16
 
17
- def verify_invocation_order(rspec_method_name, *args, &block)
17
+ def verify_invocation_order(_rspec_method_name, *_args, &_block)
18
18
  end
19
19
  end
20
20
 
21
21
  # @private
22
22
  class PositiveExpectationChain < ExpectationChain
23
-
24
23
  private
25
24
 
26
25
  def create_message_expectation_on(instance)
@@ -35,15 +35,13 @@ module RSpec
35
35
  # @private
36
36
  def each_unfulfilled_expectation_matching(method_name, *args)
37
37
  @chains_by_method_name[method_name].each do |chain|
38
- if !chain.expectation_fulfilled? && chain.matches_args?(*args)
39
- yield chain
40
- end
38
+ yield chain if !chain.expectation_fulfilled? && chain.matches_args?(*args)
41
39
  end
42
40
  end
43
41
 
44
42
  # @private
45
43
  def all_expectations_fulfilled?
46
- @chains_by_method_name.all? do |method_name, chains|
44
+ @chains_by_method_name.all? do |_method_name, chains|
47
45
  chains.all? { |chain| chain.expectation_fulfilled? }
48
46
  end
49
47
  end
@@ -74,9 +72,12 @@ module RSpec
74
72
 
75
73
  def raise_if_second_instance_to_receive_message(instance)
76
74
  @instance_with_expectation ||= instance if ExpectationChain === instance
77
- if ExpectationChain === instance && !@instance_with_expectation.equal?(instance)
78
- raise RSpec::Mocks::MockExpectationError, "Exactly one instance should have received the following message(s) but didn't: #{unfulfilled_expectations.sort.join(', ')}"
79
- end
75
+ return unless ExpectationChain === instance
76
+ return if @instance_with_expectation.equal?(instance)
77
+
78
+ raise RSpec::Mocks::MockExpectationError,
79
+ "Exactly one instance should have received the following " \
80
+ "message(s) but didn't: #{unfulfilled_expectations.sort.join(', ')}"
80
81
  end
81
82
  end
82
83
  end
@@ -60,7 +60,11 @@ module RSpec
60
60
 
61
61
  def should_receive(method_name, &block)
62
62
  perform_proxying(__method__, [method_name], block) do |proxy|
63
- proxy.add_message_expectation(method_name, &block)
63
+ # Yeah, this is a bit odd...but if we used `add_message_expectation`
64
+ # then it would act like `expect_every_instance_of(klass).to receive`.
65
+ # The any_instance recorder takes care of validating that an instance
66
+ # received the message.
67
+ proxy.add_stub(method_name, &block)
64
68
  end
65
69
  end
66
70
 
@@ -93,11 +97,11 @@ module RSpec
93
97
  end
94
98
 
95
99
  if RUBY_VERSION.to_f > 1.8
96
- def respond_to_missing?(method_name, include_private = false)
100
+ def respond_to_missing?(method_name, include_private=false)
97
101
  super || @targets.first.respond_to?(method_name, include_private)
98
102
  end
99
103
  else
100
- def respond_to?(method_name, include_private = false)
104
+ def respond_to?(method_name, include_private=false)
101
105
  super || @targets.first.respond_to?(method_name, include_private)
102
106
  end
103
107
  end
@@ -15,7 +15,7 @@ module RSpec
15
15
 
16
16
  def initialize(klass)
17
17
  @message_chains = MessageChains.new
18
- @stubs = Hash.new { |hash,key| hash[key] = [] }
18
+ @stubs = Hash.new { |hash, key| hash[key] = [] }
19
19
  @observed_methods = []
20
20
  @played_methods = {}
21
21
  @klass = klass
@@ -88,14 +88,17 @@ module RSpec
88
88
  # Used internally to verify that message expectations have been
89
89
  # fulfilled.
90
90
  def verify
91
- if @expectation_set && !message_chains.all_expectations_fulfilled?
92
- raise RSpec::Mocks::MockExpectationError, "Exactly one instance should have received the following message(s) but didn't: #{message_chains.unfulfilled_expectations.sort.join(', ')}"
93
- end
91
+ return unless @expectation_set
92
+ return if message_chains.all_expectations_fulfilled?
93
+
94
+ raise RSpec::Mocks::MockExpectationError,
95
+ "Exactly one instance should have received the following " \
96
+ "message(s) but didn't: #{message_chains.unfulfilled_expectations.sort.join(', ')}"
94
97
  end
95
98
 
96
99
  # @private
97
100
  def stop_all_observation!
98
- @observed_methods.each {|method_name| restore_method!(method_name)}
101
+ @observed_methods.each { |method_name| restore_method!(method_name) }
99
102
  end
100
103
 
101
104
  # @private
@@ -122,7 +125,7 @@ module RSpec
122
125
  end
123
126
 
124
127
  # @private
125
- def notify_received_message(object, message, args, blk)
128
+ def notify_received_message(_object, message, args, _blk)
126
129
  has_expectation = false
127
130
 
128
131
  message_chains.each_unfulfilled_expectation_matching(message, *args) do |expectation|
@@ -130,10 +133,10 @@ module RSpec
130
133
  expectation.expectation_fulfilled!
131
134
  end
132
135
 
133
- if has_expectation
134
- restore_method!(message)
135
- mark_invoked!(message)
136
- end
136
+ return unless has_expectation
137
+
138
+ restore_method!(message)
139
+ mark_invoked!(message)
137
140
  end
138
141
 
139
142
  protected
@@ -167,7 +170,7 @@ module RSpec
167
170
  end
168
171
 
169
172
  def normalize_chain(*args)
170
- args.shift.to_s.split('.').map {|s| s.to_sym}.reverse.each {|a| args.unshift a}
173
+ args.shift.to_s.split('.').map { |s| s.to_sym }.reverse.each { |a| args.unshift a }
171
174
  yield args.first, args
172
175
  end
173
176
 
@@ -186,13 +189,13 @@ module RSpec
186
189
  end
187
190
 
188
191
  def restore_original_method!(method_name)
189
- if @klass.instance_method(method_name).owner == @klass
190
- alias_method_name = build_alias_method_name(method_name)
191
- @klass.class_exec do
192
- remove_method method_name
193
- alias_method method_name, alias_method_name
194
- remove_method alias_method_name
195
- end
192
+ return unless @klass.instance_method(method_name).owner == @klass
193
+
194
+ alias_method_name = build_alias_method_name(method_name)
195
+ @klass.class_exec do
196
+ remove_method method_name
197
+ alias_method method_name, alias_method_name
198
+ remove_method alias_method_name
196
199
  end
197
200
  end
198
201
 
@@ -219,7 +222,7 @@ module RSpec
219
222
  if RSpec::Mocks.configuration.verify_partial_doubles?
220
223
  unless public_protected_or_private_method_defined?(method_name)
221
224
  raise MockExpectationError,
222
- "#{@klass} does not implement ##{method_name}"
225
+ "#{@klass} does not implement ##{method_name}"
223
226
  end
224
227
  end
225
228
 
@@ -229,14 +232,14 @@ module RSpec
229
232
  recorder = self
230
233
  @klass.__send__(:define_method, method_name) do |*args, &blk|
231
234
  recorder.playback!(self, method_name)
232
- self.__send__(method_name, *args, &blk)
235
+ __send__(method_name, *args, &blk)
233
236
  end
234
237
  end
235
238
 
236
239
  def mark_invoked!(method_name)
237
240
  backup_method!(method_name)
238
241
  recorder = self
239
- @klass.__send__(:define_method, method_name) do |*args, &blk|
242
+ @klass.__send__(:define_method, method_name) do |*_args, &_blk|
240
243
  invoked_instance = recorder.instance_that_received(method_name)
241
244
  inspect = "#<#{self.class}:#{object_id} #{instance_variables.map { |name| "#{name}=#{instance_variable_get name}" }.join(', ')}>"
242
245
  raise RSpec::Mocks::MockExpectationError, "The message '#{method_name}' was received by #{inspect} but has already been received by #{invoked_instance}"
@@ -250,15 +253,14 @@ module RSpec
250
253
  return unless problem_mod
251
254
 
252
255
  raise RSpec::Mocks::MockExpectationError,
253
- "Using `any_instance` to stub a method (#{method_name}) that has been " +
254
- "defined on a prepended module (#{problem_mod}) is not supported."
256
+ "Using `any_instance` to stub a method (#{method_name}) that has been " \
257
+ "defined on a prepended module (#{problem_mod}) is not supported."
255
258
  end
256
259
  else
257
- def allow_no_prepended_module_definition_of(method_name)
260
+ def allow_no_prepended_module_definition_of(_method_name)
258
261
  # nothing to do; prepends aren't supported on this version of ruby
259
262
  end
260
263
  end
261
-
262
264
  end
263
265
  end
264
266
  end
@@ -3,7 +3,6 @@ module RSpec
3
3
  module AnyInstance
4
4
  # @private
5
5
  class StubChain < Chain
6
-
7
6
  # @private
8
7
  def expectation_fulfilled?
9
8
  true
@@ -36,10 +35,9 @@ module RSpec
36
35
  }
37
36
  end
38
37
 
39
- def verify_invocation_order(rspec_method_name, *args, &block)
40
- unless invocation_order[rspec_method_name].include?(last_message)
41
- raise(NoMethodError, "Undefined method #{rspec_method_name}")
42
- end
38
+ def verify_invocation_order(rspec_method_name, *_args, &_block)
39
+ return if invocation_order[rspec_method_name].include?(last_message)
40
+ raise NoMethodError, "Undefined method #{rspec_method_name}"
43
41
  end
44
42
  end
45
43
  end
@@ -46,10 +46,10 @@ module RSpec
46
46
  @expected_args = expected_args
47
47
 
48
48
  @matchers = case expected_args.first
49
- when ArgumentMatchers::AnyArgsMatcher then Array
50
- when ArgumentMatchers::NoArgsMatcher then []
51
- else expected_args
52
- end
49
+ when ArgumentMatchers::AnyArgsMatcher then Array
50
+ when ArgumentMatchers::NoArgsMatcher then []
51
+ else expected_args
52
+ end
53
53
  end
54
54
 
55
55
  # @api public
@@ -1,6 +1,10 @@
1
+ # This cannot take advantage of our relative requires, since this file is a
2
+ # dependency of `rspec/mocks/argument_list_matcher.rb`. See comment there for
3
+ # details.
4
+ require 'rspec/support/matcher_definition'
5
+
1
6
  module RSpec
2
7
  module Mocks
3
-
4
8
  # ArgumentMatchers are placeholders that you can include in message
5
9
  # expectations to match arguments against a broader check than simple
6
10
  # equality.
@@ -110,7 +114,7 @@ module RSpec
110
114
  #
111
115
  # expect(object).to receive(:message).with(kind_of(Thing))
112
116
  def kind_of(klass)
113
- klass
117
+ KindOf.new(klass)
114
118
  end
115
119
 
116
120
  alias_method :a_kind_of, :kind_of
@@ -131,7 +135,7 @@ module RSpec
131
135
 
132
136
  # @private
133
137
  class AnyArgMatcher
134
- def ===(other)
138
+ def ===(_other)
135
139
  true
136
140
  end
137
141
 
@@ -166,14 +170,14 @@ module RSpec
166
170
 
167
171
  def ===(predicate, actual)
168
172
  @expected.__send__(predicate) do |k, v|
169
- actual.has_key?(k) && Support::FuzzyMatcher.values_match?(v, actual[k])
173
+ actual.key?(k) && Support::FuzzyMatcher.values_match?(v, actual[k])
170
174
  end
171
175
  rescue NoMethodError
172
176
  false
173
177
  end
174
178
 
175
179
  def description(name)
176
- "#{name}(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})"
180
+ "#{name}(#{@expected.inspect.sub(/^\{/, "").sub(/\}$/, "")})"
177
181
  end
178
182
  end
179
183
 
@@ -221,7 +225,7 @@ module RSpec
221
225
  end
222
226
 
223
227
  def ===(value)
224
- @methods_to_respond_to.all? {|message| value.respond_to?(message)}
228
+ @methods_to_respond_to.all? { |message| value.respond_to?(message) }
225
229
  end
226
230
 
227
231
  def description
@@ -244,6 +248,35 @@ module RSpec
244
248
  end
245
249
  end
246
250
 
251
+ # @private
252
+ class KindOf
253
+ def initialize(klass)
254
+ @klass = klass
255
+ end
256
+
257
+ def ===(actual)
258
+ actual.kind_of?(@klass)
259
+ end
260
+
261
+ def description
262
+ "kind of #{@klass.name}"
263
+ end
264
+ end
265
+
266
+ matcher_namespace = name + '::'
267
+ ::RSpec::Support.register_matcher_definition do |object|
268
+ # This is the best we have for now. We should tag all of our matchers
269
+ # with a module or something so we can test for it directly.
270
+ #
271
+ # (Note Module#parent in ActiveSupport is defined in a similar way.)
272
+ begin
273
+ object.class.name.include?(matcher_namespace)
274
+ rescue NoMethodError
275
+ # Some objects, like BasicObject, don't implemented standard
276
+ # reflection methods.
277
+ false
278
+ end
279
+ end
247
280
  end
248
281
  end
249
282
  end
@@ -2,7 +2,6 @@ module RSpec
2
2
  module Mocks
3
3
  # Provides configuration options for rspec-mocks.
4
4
  class Configuration
5
-
6
5
  def initialize
7
6
  @yield_receiver_to_any_instance_implementation_blocks = true
8
7
  @verify_doubled_constant_names = false
@@ -22,13 +21,11 @@ module RSpec
22
21
  # @example
23
22
  #
24
23
  # RSpec.configure do |rspec|
25
- # rspec.mock_with :rspc do |mocks|
24
+ # rspec.mock_with :rspec do |mocks|
26
25
  # mocks.yield_receiver_to_any_instance_implementation_blocks = false
27
26
  # end
28
27
  # end
29
- def yield_receiver_to_any_instance_implementation_blocks=(arg)
30
- @yield_receiver_to_any_instance_implementation_blocks = arg
31
- end
28
+ attr_writer :yield_receiver_to_any_instance_implementation_blocks
32
29
 
33
30
  # Adds `stub` and `should_receive` to the given
34
31
  # modules or classes. This is usually only necessary
@@ -105,9 +102,7 @@ module RSpec
105
102
  # constant. You probably only want to set this when running your entire
106
103
  # test suite, with all production code loaded. Setting this for an
107
104
  # isolated unit test will prevent you from being able to isolate it!
108
- def verify_doubled_constant_names=(val)
109
- @verify_doubled_constant_names = val
110
- end
105
+ attr_writer :verify_doubled_constant_names
111
106
 
112
107
  def transfer_nested_constants?
113
108
  !!@transfer_nested_constants
@@ -115,9 +110,7 @@ module RSpec
115
110
 
116
111
  # Sets the default for the `transfer_nested_constants` option when
117
112
  # stubbing constants.
118
- def transfer_nested_constants=(val)
119
- @transfer_nested_constants = val
120
- end
113
+ attr_writer :transfer_nested_constants
121
114
 
122
115
  # When set to true, partial mocks will be verified the same as object
123
116
  # doubles. Any stubs will have their arguments checked against the original