rspec-mocks 3.0.4 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Changelog.md +26 -0
  5. data/README.md +29 -15
  6. data/lib/rspec/mocks/any_instance/chain.rb +2 -2
  7. data/lib/rspec/mocks/any_instance/expectation_chain.rb +2 -3
  8. data/lib/rspec/mocks/any_instance/message_chains.rb +8 -7
  9. data/lib/rspec/mocks/any_instance/proxy.rb +2 -2
  10. data/lib/rspec/mocks/any_instance/recorder.rb +27 -25
  11. data/lib/rspec/mocks/any_instance/stub_chain.rb +3 -5
  12. data/lib/rspec/mocks/argument_list_matcher.rb +4 -4
  13. data/lib/rspec/mocks/argument_matchers.rb +23 -5
  14. data/lib/rspec/mocks/configuration.rb +3 -10
  15. data/lib/rspec/mocks/error_generator.rb +33 -27
  16. data/lib/rspec/mocks/example_methods.rb +74 -6
  17. data/lib/rspec/mocks/instance_method_stasher.rb +5 -5
  18. data/lib/rspec/mocks/matchers/have_received.rb +7 -8
  19. data/lib/rspec/mocks/matchers/receive.rb +8 -8
  20. data/lib/rspec/mocks/matchers/receive_message_chain.rb +4 -5
  21. data/lib/rspec/mocks/matchers/receive_messages.rb +6 -7
  22. data/lib/rspec/mocks/message_chain.rb +5 -5
  23. data/lib/rspec/mocks/message_expectation.rb +56 -28
  24. data/lib/rspec/mocks/method_double.rb +15 -12
  25. data/lib/rspec/mocks/method_reference.rb +8 -7
  26. data/lib/rspec/mocks/mutate_const.rb +26 -100
  27. data/lib/rspec/mocks/object_reference.rb +12 -13
  28. data/lib/rspec/mocks/order_group.rb +4 -5
  29. data/lib/rspec/mocks/proxy.rb +31 -25
  30. data/lib/rspec/mocks/space.rb +24 -24
  31. data/lib/rspec/mocks/syntax.rb +8 -8
  32. data/lib/rspec/mocks/targets.rb +6 -6
  33. data/lib/rspec/mocks/test_double.rb +3 -3
  34. data/lib/rspec/mocks/verifying_double.rb +10 -12
  35. data/lib/rspec/mocks/verifying_message_expecation.rb +15 -13
  36. data/lib/rspec/mocks/verifying_proxy.rb +11 -15
  37. data/lib/rspec/mocks/version.rb +1 -1
  38. metadata +5 -5
  39. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1c69d8b3717bc8d498e502612ce0507fb46912d3
4
- data.tar.gz: bb8a1856bb4bc4f088349415b610cc6a17e260b3
3
+ metadata.gz: 16d5f671e68051be014fb930e9980f5a0c19d5ee
4
+ data.tar.gz: b035e939d0afc695e7b03485f1edc2356c5b0bc0
5
5
  SHA512:
6
- metadata.gz: 041cac290b56a5efc2a35170ade5b2330184b40f81e1fbe7499d9c67587a1a40d9cc23302e984669136d82005e35a74f1026fe48698d3cd70dbf9a7010e4e706
7
- data.tar.gz: 9faa892d0fc4d9d26a0132ba718b610057b1ebcfaaa042ab25a838f8484451b594596ce003abada7fd4f462822088b6f171a226ad02381c339c013a1193128f4
6
+ metadata.gz: 46ba65b5222400961866c699044adba07374c0a2c241e2f011e2eb55b8fdfc3c167db0f371a925a06704ac6d209e1400a1802c45d94ea25ae38142bcf396c9bc
7
+ data.tar.gz: 617ae574ebe247f7b2ee1c6a45a94fb200006b56dd8c98ec536d655622a85749e0a10985e491e47709a744ebc450d494d591b5367c91bd89cc3f0001e6f95c9b
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,29 @@
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
+
1
27
  ### 3.0.4 / 2014-08-14
2
28
  [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.3...v3.0.4)
3
29
 
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
@@ -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
@@ -97,11 +97,11 @@ module RSpec
97
97
  end
98
98
 
99
99
  if RUBY_VERSION.to_f > 1.8
100
- def respond_to_missing?(method_name, include_private = false)
100
+ def respond_to_missing?(method_name, include_private=false)
101
101
  super || @targets.first.respond_to?(method_name, include_private)
102
102
  end
103
103
  else
104
- def respond_to?(method_name, include_private = false)
104
+ def respond_to?(method_name, include_private=false)
105
105
  super || @targets.first.respond_to?(method_name, include_private)
106
106
  end
107
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.
@@ -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
@@ -259,6 +263,20 @@ module RSpec
259
263
  end
260
264
  end
261
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
262
280
  end
263
281
  end
264
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
@@ -26,9 +25,7 @@ module RSpec
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