3
3
module RSpec
4
4
module Rails
5
5
module Matchers
6
+ # @api private
7
+ # Sentinel value to distinguish between no argument passed vs explicitly passed nil.
8
+ # This follows the same pattern as RSpec's raise_error matcher.
9
+ UndefinedValue = Object . new . freeze
10
+
6
11
# @api private
7
12
class ErrorSubscriber
8
13
attr_reader :events
@@ -28,17 +33,20 @@ def report(error, **attrs)
28
33
class HaveReportedError < RSpec ::Rails ::Matchers ::BaseMatcher
29
34
# Initialize the matcher following raise_error patterns
30
35
#
36
+ # Uses UndefinedValue as default to distinguish between no argument
37
+ # passed vs explicitly passed nil (same as raise_error matcher).
38
+ #
31
39
# @param expected_error_or_message [Class, String, Regexp, nil]
32
40
# Error class, message string, or message pattern
33
41
# @param expected_message [String, Regexp, nil]
34
42
# Expected message when first param is a class
35
- def initialize ( expected_error_or_message = nil , expected_message = nil )
43
+ def initialize ( expected_error_or_message = UndefinedValue , expected_message = nil )
36
44
@actual_error = nil
37
45
@attributes = { }
38
46
@error_subscriber = nil
39
47
40
48
case expected_error_or_message
41
- when nil
49
+ when nil , UndefinedValue
42
50
@expected_error = nil
43
51
@expected_message = expected_message
44
52
when String , Regexp
@@ -232,7 +240,7 @@ def unmatched_attributes(actual)
232
240
#
233
241
# @param expected_error_or_message [Class, String, Regexp, nil] the expected error class, message string, or message pattern
234
242
# @param expected_message [String, Regexp, nil] the expected error message to match
235
- def have_reported_error ( expected_error_or_message = nil , expected_message = nil )
243
+ def have_reported_error ( expected_error_or_message = UndefinedValue , expected_message = nil )
236
244
HaveReportedError . new ( expected_error_or_message , expected_message )
237
245
end
238
246
0 commit comments