rspec-mocks 3.0.0.beta1 → 3.0.0.beta2

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 (114) hide show
  1. data.tar.gz.sig +1 -1
  2. data/Changelog.md +95 -3
  3. data/README.md +27 -13
  4. data/features/README.md +15 -7
  5. data/features/argument_matchers/README.md +5 -5
  6. data/features/argument_matchers/explicit.feature +6 -6
  7. data/features/argument_matchers/general_matchers.feature +4 -4
  8. data/features/argument_matchers/type_matchers.feature +2 -2
  9. data/features/message_expectations/README.md +29 -27
  10. data/features/message_expectations/call_original.feature +0 -1
  11. data/features/message_expectations/message_chains_using_expect.feature +49 -0
  12. data/features/method_stubs/README.md +2 -1
  13. data/features/method_stubs/{any_instance.feature → allow_any_instance_of.feature} +12 -12
  14. data/features/method_stubs/{stub_chain.feature → receive_message_chain.feature} +3 -3
  15. data/features/method_stubs/to_ary.feature +1 -1
  16. data/features/mutating_constants/stub_defined_constant.feature +0 -1
  17. data/features/outside_rspec/standalone.feature +1 -1
  18. data/features/spies/spy_pure_mock_method.feature +1 -1
  19. data/features/test_frameworks/test_unit.feature +21 -10
  20. data/features/verifying_doubles/README.md +17 -0
  21. data/features/verifying_doubles/class_doubles.feature +1 -16
  22. data/features/verifying_doubles/dynamic_classes.feature +0 -1
  23. data/features/verifying_doubles/{introduction.feature → instance_doubles.feature} +41 -23
  24. data/features/verifying_doubles/partial_doubles.feature +2 -2
  25. data/lib/rspec/mocks.rb +69 -82
  26. data/lib/rspec/mocks/any_instance/expect_chain_chain.rb +35 -0
  27. data/lib/rspec/mocks/any_instance/expectation_chain.rb +1 -2
  28. data/lib/rspec/mocks/any_instance/recorder.rb +52 -18
  29. data/lib/rspec/mocks/any_instance/stub_chain.rb +1 -1
  30. data/lib/rspec/mocks/any_instance/stub_chain_chain.rb +4 -0
  31. data/lib/rspec/mocks/argument_list_matcher.rb +10 -44
  32. data/lib/rspec/mocks/argument_matchers.rb +132 -163
  33. data/lib/rspec/mocks/configuration.rb +28 -4
  34. data/lib/rspec/mocks/error_generator.rb +46 -13
  35. data/lib/rspec/mocks/example_methods.rb +13 -12
  36. data/lib/rspec/mocks/extensions/marshal.rb +1 -1
  37. data/lib/rspec/mocks/framework.rb +3 -4
  38. data/lib/rspec/mocks/instance_method_stasher.rb +2 -3
  39. data/lib/rspec/mocks/matchers/have_received.rb +8 -6
  40. data/lib/rspec/mocks/matchers/receive.rb +28 -20
  41. data/lib/rspec/mocks/matchers/receive_message_chain.rb +65 -0
  42. data/lib/rspec/mocks/matchers/receive_messages.rb +3 -2
  43. data/lib/rspec/mocks/message_chain.rb +91 -0
  44. data/lib/rspec/mocks/message_expectation.rb +86 -80
  45. data/lib/rspec/mocks/method_double.rb +2 -11
  46. data/lib/rspec/mocks/method_reference.rb +82 -23
  47. data/lib/rspec/mocks/method_signature_verifier.rb +207 -0
  48. data/lib/rspec/mocks/mutate_const.rb +34 -50
  49. data/lib/rspec/mocks/object_reference.rb +0 -1
  50. data/lib/rspec/mocks/proxy.rb +70 -13
  51. data/lib/rspec/mocks/ruby_features.rb +24 -0
  52. data/lib/rspec/mocks/space.rb +105 -31
  53. data/lib/rspec/mocks/standalone.rb +2 -2
  54. data/lib/rspec/mocks/syntax.rb +43 -8
  55. data/lib/rspec/mocks/targets.rb +16 -7
  56. data/lib/rspec/mocks/test_double.rb +41 -15
  57. data/lib/rspec/mocks/verifying_double.rb +51 -4
  58. data/lib/rspec/mocks/verifying_message_expecation.rb +12 -12
  59. data/lib/rspec/mocks/verifying_proxy.rb +32 -19
  60. data/lib/rspec/mocks/version.rb +1 -1
  61. data/spec/rspec/mocks/and_call_original_spec.rb +28 -7
  62. data/spec/rspec/mocks/and_return_spec.rb +23 -0
  63. data/spec/rspec/mocks/and_yield_spec.rb +1 -2
  64. data/spec/rspec/mocks/any_instance_spec.rb +33 -17
  65. data/spec/rspec/mocks/array_including_matcher_spec.rb +6 -6
  66. data/spec/rspec/mocks/before_all_spec.rb +132 -0
  67. data/spec/rspec/mocks/block_return_value_spec.rb +12 -1
  68. data/spec/rspec/mocks/combining_implementation_instructions_spec.rb +9 -11
  69. data/spec/rspec/mocks/configuration_spec.rb +14 -1
  70. data/spec/rspec/mocks/double_spec.rb +867 -24
  71. data/spec/rspec/mocks/example_methods_spec.rb +13 -0
  72. data/spec/rspec/mocks/extensions/marshal_spec.rb +17 -17
  73. data/spec/rspec/mocks/failing_argument_matchers_spec.rb +29 -1
  74. data/spec/rspec/mocks/hash_excluding_matcher_spec.rb +12 -12
  75. data/spec/rspec/mocks/hash_including_matcher_spec.rb +21 -17
  76. data/spec/rspec/mocks/instance_method_stasher_spec.rb +2 -3
  77. data/spec/rspec/mocks/matchers/have_received_spec.rb +7 -0
  78. data/spec/rspec/mocks/matchers/receive_message_chain_spec.rb +198 -0
  79. data/spec/rspec/mocks/matchers/receive_messages_spec.rb +2 -2
  80. data/spec/rspec/mocks/matchers/receive_spec.rb +19 -6
  81. data/spec/rspec/mocks/method_signature_verifier_spec.rb +272 -0
  82. data/spec/rspec/mocks/methods_spec.rb +0 -1
  83. data/spec/rspec/mocks/multiple_return_value_spec.rb +2 -2
  84. data/spec/rspec/mocks/mutate_const_spec.rb +24 -1
  85. data/spec/rspec/mocks/nil_expectation_warning_spec.rb +6 -22
  86. data/spec/rspec/mocks/null_object_mock_spec.rb +13 -7
  87. data/spec/rspec/mocks/options_hash_spec.rb +3 -3
  88. data/spec/rspec/mocks/{partial_mock_spec.rb → partial_double_spec.rb} +5 -2
  89. data/spec/rspec/mocks/{partial_mock_using_mocks_directly_spec.rb → partial_double_using_mocks_directly_spec.rb} +1 -1
  90. data/spec/rspec/mocks/passing_argument_matchers_spec.rb +18 -0
  91. data/spec/rspec/mocks/serialization_spec.rb +1 -0
  92. data/spec/rspec/mocks/space_spec.rb +218 -7
  93. data/spec/rspec/mocks/stub_chain_spec.rb +6 -0
  94. data/spec/rspec/mocks/stub_spec.rb +0 -6
  95. data/spec/rspec/mocks/syntax_spec.rb +19 -0
  96. data/spec/rspec/mocks/test_double_spec.rb +0 -1
  97. data/spec/rspec/mocks/verifying_double_spec.rb +281 -18
  98. data/spec/rspec/mocks/verifying_message_expecation_spec.rb +7 -6
  99. data/spec/rspec/mocks_spec.rb +168 -42
  100. data/spec/spec_helper.rb +34 -22
  101. metadata +94 -63
  102. metadata.gz.sig +0 -0
  103. checksums.yaml +0 -15
  104. checksums.yaml.gz.sig +0 -2
  105. data/features/outside_rspec/configuration.feature +0 -60
  106. data/lib/rspec/mocks/arity_calculator.rb +0 -66
  107. data/lib/rspec/mocks/errors.rb +0 -12
  108. data/lib/rspec/mocks/mock.rb +0 -7
  109. data/lib/rspec/mocks/proxy_for_nil.rb +0 -37
  110. data/lib/rspec/mocks/stub_chain.rb +0 -51
  111. data/spec/rspec/mocks/argument_expectation_spec.rb +0 -32
  112. data/spec/rspec/mocks/arity_calculator_spec.rb +0 -95
  113. data/spec/rspec/mocks/mock_space_spec.rb +0 -113
  114. data/spec/rspec/mocks/mock_spec.rb +0 -788
@@ -1,8 +1,5 @@
1
1
  module RSpec
2
2
  module Mocks
3
- UnsupportedMatcherError = Class.new(StandardError)
4
- NegationUnsupportedError = Class.new(StandardError)
5
-
6
3
  class TargetBase
7
4
  def initialize(target)
8
5
  @target = target
@@ -10,7 +7,7 @@ module RSpec
10
7
 
11
8
  def self.delegate_to(matcher_method)
12
9
  define_method(:to) do |matcher, &block|
13
- unless Matchers::Receive === matcher || Matchers::ReceiveMessages === matcher
10
+ unless matcher_allowed?(matcher)
14
11
  raise_unsupported_matcher(:to, matcher)
15
12
  end
16
13
  define_matcher(matcher, matcher_method, &block)
@@ -21,8 +18,10 @@ module RSpec
21
18
  method_name = options.fetch(:from)
22
19
  define_method(method_name) do |matcher, &block|
23
20
  case matcher
24
- when Matchers::Receive then define_matcher(matcher, matcher_method, &block)
25
- when Matchers::ReceiveMessages then raise_negation_unsupported(method_name, matcher)
21
+ when Matchers::Receive
22
+ define_matcher(matcher, matcher_method, &block)
23
+ when Matchers::ReceiveMessages, Matchers::ReceiveMessageChain
24
+ raise_negation_unsupported(method_name, matcher)
26
25
  else
27
26
  raise_unsupported_matcher(method_name, matcher)
28
27
  end
@@ -37,6 +36,17 @@ module RSpec
37
36
 
38
37
  private
39
38
 
39
+ def matcher_allowed?(matcher)
40
+ ALLOWED_MATCHERS.include?(matcher.class)
41
+ end
42
+
43
+ #@api private
44
+ ALLOWED_MATCHERS = [
45
+ Matchers::Receive,
46
+ Matchers::ReceiveMessages,
47
+ Matchers::ReceiveMessageChain,
48
+ ]
49
+
40
50
  def define_matcher(matcher, name, &block)
41
51
  matcher.__send__(name, @target, &block)
42
52
  end
@@ -87,4 +97,3 @@ module RSpec
87
97
  end
88
98
  end
89
99
  end
90
-
@@ -1,8 +1,8 @@
1
1
  module RSpec
2
2
  module Mocks
3
- # Implements the methods needed for a pure test double. RSpec::Mocks::Mock
3
+ # Implements the methods needed for a pure test double. RSpec::Mocks::Double
4
4
  # includes this module, and it is provided for cases where you want a
5
- # pure test double without subclassing RSpec::Mocks::Mock.
5
+ # pure test double without subclassing RSpec::Mocks::Double.
6
6
  module TestDouble
7
7
  # Extends the TestDouble module onto the given object and
8
8
  # initializes it as a test double.
@@ -53,8 +53,6 @@ module RSpec
53
53
  inspect.gsub('<','[').gsub('>',']')
54
54
  end
55
55
 
56
- alias_method :to_str, :to_s
57
-
58
56
  # @private
59
57
  def respond_to?(message, incl_private=false)
60
58
  __mock_proxy.null_object? ? true : super
@@ -62,12 +60,17 @@ module RSpec
62
60
 
63
61
  # @private
64
62
  def __build_mock_proxy(order_group)
65
- Proxy.new(self, order_group, @name)
63
+ __raise_expired_error or TestDoubleProxy.new(self, order_group, @name)
64
+ end
65
+
66
+ def __disallow_further_usage!
67
+ @__expired = true
66
68
  end
67
69
 
68
70
  private
69
71
 
70
72
  def __initialize_as_test_double(name=nil, stubs={})
73
+ @__expired = false
71
74
  if Hash === name && stubs.empty?
72
75
  stubs = name
73
76
  @name = nil
@@ -78,21 +81,33 @@ module RSpec
78
81
  end
79
82
 
80
83
  def method_missing(message, *args, &block)
81
- if __mock_proxy.null_object?
84
+ proxy = __mock_proxy
85
+ proxy.record_message_received(message, *args, &block)
86
+
87
+ if proxy.null_object?
82
88
  case message
83
89
  when :to_int then return 0
84
90
  when :to_a, :to_ary then return nil
91
+ else return self
85
92
  end
86
93
  end
87
- __mock_proxy.record_message_received(message, *args, &block)
88
-
89
- begin
90
- __mock_proxy.null_object? ? self : super
91
- rescue NameError
92
- # Required wrapping doubles in an Array on Ruby 1.9.2
93
- raise NoMethodError if [:to_a, :to_ary].include? message
94
- __mock_proxy.raise_unexpected_message_error(message, *args)
94
+
95
+ # Defined private and protected methods will still trigger `method_missing`
96
+ # when called publicly. We want ruby's method visibility error to get raised,
97
+ # so we simply delegate to `super` in that case.
98
+ # ...well, we would delegate to `super`, but there's a JRuby
99
+ # bug, so we raise our own visibility error instead:
100
+ # https://github.com/jruby/jruby/issues/1398
101
+ visibility = proxy.visibility_for(message)
102
+ if visibility == :private || visibility == :protected
103
+ ErrorGenerator.new(self, @name).raise_non_public_error(
104
+ message, visibility
105
+ )
95
106
  end
107
+
108
+ # Required wrapping doubles in an Array on Ruby 1.9.2
109
+ raise NoMethodError if [:to_a, :to_ary].include? message
110
+ proxy.raise_unexpected_message_error(message, *args)
96
111
  end
97
112
 
98
113
  def assign_stubs(stubs)
@@ -102,8 +117,19 @@ module RSpec
102
117
  end
103
118
 
104
119
  def __mock_proxy
105
- ::RSpec::Mocks.proxy_for(self)
120
+ ::RSpec::Mocks.space.proxy_for(self)
121
+ end
122
+
123
+ def __raise_expired_error
124
+ return false unless @__expired
125
+ ErrorGenerator.new(self, @name).raise_expired_test_double_error
106
126
  end
107
127
  end
128
+
129
+ # A generic test double object. `double`, `instance_double` and friends
130
+ # return an instance of this.
131
+ class Double
132
+ include TestDouble
133
+ end
108
134
  end
109
135
  end
@@ -1,22 +1,63 @@
1
- require 'rspec/mocks/mock'
2
1
  require 'rspec/mocks/verifying_proxy'
2
+ require 'stringio'
3
3
 
4
4
  module RSpec
5
5
  module Mocks
6
6
 
7
+ # @api private
7
8
  module VerifyingDouble
9
+ def respond_to?(message, include_private=false)
10
+ return super unless null_object?
11
+
12
+ method_ref = __mock_proxy.method_reference[message]
13
+
14
+ return case method_ref.visibility
15
+ when :public then true
16
+ when :private then include_private
17
+ when :protected then include_private || RUBY_VERSION.to_f < 2.0
18
+ else !method_ref.unimplemented?
19
+ end
20
+ end
21
+
8
22
  def method_missing(message, *args, &block)
9
23
  # Null object conditional is an optimization. If not a null object,
10
24
  # validity of method expectations will have been checked at definition
11
25
  # time.
12
- __mock_proxy.ensure_implemented(message) if null_object?
26
+ if null_object?
27
+ if @__sending_message == message
28
+ __mock_proxy.ensure_implemented(message)
29
+ else
30
+ __mock_proxy.ensure_publicly_implemented(message, self)
31
+ end
32
+ end
33
+
34
+ super
35
+ end
36
+
37
+ # Redefining `__send__` causes ruby to issue a warning.
38
+ old, $stderr = $stderr, StringIO.new
39
+ def __send__(name, *args, &block)
40
+ @__sending_message = name
13
41
  super
42
+ ensure
43
+ @__sending_message = nil
44
+ end
45
+ $stderr = old
46
+
47
+ def send(name, *args, &block)
48
+ __send__(name, *args, &block)
49
+ end
50
+
51
+ def __initialize_as_test_double(*args)
52
+ super
53
+ @__sending_message = nil
14
54
  end
15
55
  end
16
56
 
17
57
  # A mock providing a custom proxy that can verify the validity of any
18
58
  # method stubs or expectations against the public instance methods of the
19
59
  # given class.
60
+ # @api private
20
61
  class InstanceVerifyingDouble
21
62
  include TestDouble
22
63
  include VerifyingDouble
@@ -24,7 +65,10 @@ module RSpec
24
65
  def initialize(doubled_module, *args)
25
66
  @doubled_module = doubled_module
26
67
 
27
- __initialize_as_test_double(doubled_module, *args)
68
+ __initialize_as_test_double(
69
+ "#{doubled_module.description} (instance)",
70
+ *args
71
+ )
28
72
  end
29
73
 
30
74
  def __build_mock_proxy(order_group)
@@ -37,6 +81,7 @@ module RSpec
37
81
 
38
82
  # An awkward module necessary because we cannot otherwise have
39
83
  # ClassVerifyingDouble inherit from Module and still share these methods.
84
+ # @api private
40
85
  module ObjectVerifyingDoubleMethods
41
86
  include TestDouble
42
87
  include VerifyingDouble
@@ -44,7 +89,7 @@ module RSpec
44
89
  def initialize(doubled_module, *args)
45
90
  @doubled_module = doubled_module
46
91
 
47
- __initialize_as_test_double(doubled_module, *args)
92
+ __initialize_as_test_double(doubled_module.description, *args)
48
93
  end
49
94
 
50
95
  def __build_mock_proxy(order_group)
@@ -62,6 +107,7 @@ module RSpec
62
107
 
63
108
  # Similar to an InstanceVerifyingDouble, except that it verifies against
64
109
  # public methods of the given object.
110
+ # @api private
65
111
  class ObjectVerifyingDouble
66
112
  include ObjectVerifyingDoubleMethods
67
113
  end
@@ -69,6 +115,7 @@ module RSpec
69
115
  # Effectively the same as an ObjectVerifyingDouble (since a class is a type
70
116
  # of object), except with Module in the inheritance chain so that
71
117
  # transferring nested constants to work.
118
+ # @api private
72
119
  class ClassVerifyingDouble < Module
73
120
  include ObjectVerifyingDoubleMethods
74
121
  end
@@ -1,11 +1,12 @@
1
- require 'rspec/mocks/arity_calculator'
1
+ require 'rspec/mocks/method_signature_verifier'
2
2
 
3
3
  module RSpec
4
4
  module Mocks
5
5
 
6
6
  # A message expectation that knows about the real implementation of the
7
7
  # message being expected, so that it can verify that any expectations
8
- # have the correct arity.
8
+ # have the valid arguments.
9
+ # @api private
9
10
  class VerifyingMessageExpectation < MessageExpectation
10
11
 
11
12
  # A level of indirection is used here rather than just passing in the
@@ -25,36 +26,35 @@ module RSpec
25
26
  # @override
26
27
  def with(*args, &block)
27
28
  unless ArgumentMatchers::AnyArgsMatcher === args.first
28
- expected_arity = if ArgumentMatchers::NoArgsMatcher === args.first
29
- 0
29
+ expected_args = if ArgumentMatchers::NoArgsMatcher === args.first
30
+ []
30
31
  elsif args.length > 0
31
- args.length
32
+ args
32
33
  else
33
34
  # No arguments given, this will raise.
34
35
  super
35
36
  end
36
37
 
37
- ensure_arity!(expected_arity)
38
+ validate_arguments!(expected_args)
38
39
  end
39
40
  super
40
41
  end
41
42
 
42
43
  private
43
44
 
44
- def ensure_arity!(actual)
45
+ def validate_arguments!(actual_args)
45
46
  return if method_reference.nil?
46
47
 
47
- method_reference.when_defined do |method|
48
- calculator = ArityCalculator.new(method)
49
- unless calculator.within_range?(actual)
48
+ method_reference.with_signature do |signature|
49
+ verifier = MethodSignatureVerifier.new(signature, actual_args)
50
+ unless verifier.valid?
50
51
  # Fail fast is required, otherwise the message expecation will fail
51
52
  # as well ("expected method not called") and clobber this one.
52
53
  @failed_fast = true
53
- @error_generator.raise_arity_error(calculator, actual)
54
+ @error_generator.raise_invalid_arguments_error(verifier)
54
55
  end
55
56
  end
56
57
  end
57
58
  end
58
59
  end
59
60
  end
60
-
@@ -4,6 +4,7 @@ require 'rspec/mocks/method_reference'
4
4
  module RSpec
5
5
  module Mocks
6
6
 
7
+ # @api private
7
8
  module VerifyingProxyMethods
8
9
  def add_stub(location, method_name, opts={}, &implementation)
9
10
  ensure_implemented(method_name)
@@ -21,21 +22,28 @@ module RSpec
21
22
  end
22
23
 
23
24
  def ensure_implemented(method_name)
24
- return unless @doubled_module.defined?
25
-
26
- method_reference[method_name].when_unimplemented do
25
+ if method_reference[method_name].unimplemented?
27
26
  @error_generator.raise_unimplemented_error(
28
27
  @doubled_module,
29
28
  method_name
30
29
  )
31
30
  end
32
31
  end
32
+
33
+ def ensure_publicly_implemented(method_name, object)
34
+ ensure_implemented(method_name)
35
+ visibility = method_reference[method_name].visibility
36
+
37
+ unless visibility == :public
38
+ @error_generator.raise_non_public_error(method_name, visibility)
39
+ end
40
+ end
33
41
  end
34
42
 
35
43
  # A verifying proxy mostly acts like a normal proxy, except that it
36
44
  # contains extra logic to try and determine the validity of any expectation
37
45
  # set on it. This includes whether or not methods have been defined and the
38
- # arity of method calls.
46
+ # validatiy of arguments on method calls.
39
47
  #
40
48
  # In all other ways this behaves like a normal proxy. It only adds the
41
49
  # verification behaviour to specific methods then delegates to the parent
@@ -56,7 +64,7 @@ module RSpec
56
64
  @method_reference_class = method_reference_class
57
65
 
58
66
  # A custom method double is required to pass through a way to lookup
59
- # methods to determine their arity. This is only relevant if the doubled
67
+ # methods to determine their parameters. This is only relevant if the doubled
60
68
  # class is loaded.
61
69
  @method_doubles = Hash.new do |h, k|
62
70
  h[k] = VerifyingMethodDouble.new(@object, k, self, method_reference[k])
@@ -68,9 +76,14 @@ module RSpec
68
76
  h[k] = @method_reference_class.new(@doubled_module, k)
69
77
  end
70
78
  end
79
+
80
+ def visibility_for(method_name)
81
+ method_reference[method_name].visibility
82
+ end
71
83
  end
72
84
 
73
- class VerifyingPartialMockProxy < PartialMockProxy
85
+ # @api private
86
+ class VerifyingPartialDoubleProxy < PartialDoubleProxy
74
87
  include VerifyingProxyMethods
75
88
 
76
89
  def initialize(object, expectation_ordering)
@@ -78,7 +91,7 @@ module RSpec
78
91
  @doubled_module = DirectObjectReference.new(object)
79
92
 
80
93
  # A custom method double is required to pass through a way to lookup
81
- # methods to determine their arity.
94
+ # methods to determine their parameters.
82
95
  @method_doubles = Hash.new do |h, k|
83
96
  h[k] = VerifyingExistingMethodDouble.new(object, k, self)
84
97
  end
@@ -105,29 +118,29 @@ module RSpec
105
118
  end
106
119
 
107
120
  def proxy_method_invoked(obj, *args, &block)
108
- ensure_arity!(args.length)
121
+ validate_arguments!(args)
109
122
  super
110
123
  end
111
124
 
112
125
  private
113
126
 
114
- def ensure_arity!(arity)
115
- @method_reference.when_defined do |method|
116
- calculator = ArityCalculator.new(method)
117
- unless calculator.within_range?(arity)
118
- raise ArgumentError, "wrong number of arguments (#{arity} for #{method.arity})"
127
+ def validate_arguments!(actual_args)
128
+ @method_reference.with_signature do |signature|
129
+ verifier = MethodSignatureVerifier.new(signature, actual_args)
130
+ unless verifier.valid?
131
+ raise ArgumentError, verifier.error_message
119
132
  end
120
133
  end
121
134
  end
122
135
  end
123
136
 
124
- # @api private
125
- #
126
137
  # A VerifyingMethodDouble fetches the method to verify against from the
127
138
  # original object, using a MethodReference. This works for pure doubles,
128
139
  # but when the original object is itself the one being modified we need to
129
140
  # collapse the reference and the method double into a single object so that
130
141
  # we can access the original pristine method definition.
142
+ #
143
+ # @api private
131
144
  class VerifyingExistingMethodDouble < VerifyingMethodDouble
132
145
  def initialize(object, method_name, proxy)
133
146
  super(object, method_name, proxy, self)
@@ -139,12 +152,12 @@ module RSpec
139
152
  save_original_method!
140
153
  end
141
154
 
142
- def when_defined
143
- yield original_method
155
+ def with_signature
156
+ yield MethodSignature.new(original_method)
144
157
  end
145
158
 
146
- def when_unimplemented
147
- yield unless @valid_method
159
+ def unimplemented?
160
+ !@valid_method
148
161
  end
149
162
  end
150
163
  end