lib/rspec/sorbet/doubles.rb in rspec-sorbet-1.5.0 vs lib/rspec/sorbet/doubles.rb in rspec-sorbet-1.6.0
- old
+ new
@@ -1,5 +1,6 @@
+# typed: false
# frozen_string_literal: true
require 'sorbet-runtime'
module RSpec
@@ -18,38 +19,44 @@
alias_method :allow_instance_doubles!, :allow_doubles!
private
INLINE_DOUBLE_REGEX =
- /T.(let|cast): Expected type (T.(any|nilable)\()?(?<expected_classes>[a-zA-Z:: ,]*)(\))?, got type (.*) with value #<(Instance|Class|Object)Double\((?<doubled_module>[a-zA-Z:: ,]*)\)/.freeze
+ /T.(let|cast): Expected type (T.(any|nilable)\()?(?<expected_classes>[a-zA-Z:: ,]*)(\))?, got type (.*) with value #<(Instance|Class|Object)?Double([\(]|[ ])(?<doubled_module>[a-zA-Z:: ,]*)(\))?/.freeze
def inline_type_error_handler(error)
case error
when TypeError
message = error.message
- return if double_message_with_ellipsis?(message) || typed_array_message?(message)
+ return if unable_to_check_type_for_message?(message)
_, expected_types_string, doubled_module_string = (message.match(INLINE_DOUBLE_REGEX) || [])[0..2]
+ return unless doubled_module_string
+
raise error unless expected_types_string && doubled_module_string
expected_types = expected_types_string.split(',').map do |expected_type_string|
Object.const_get(expected_type_string.strip)
end
doubled_module = Object.const_get(doubled_module_string)
valid = expected_types.any? do |expected_type|
doubled_module.ancestors.include?(expected_type)
end
-
raise error unless valid
else
raise error
end
end
+ def unable_to_check_type_for_message?(message)
+ double_message_with_ellipsis?(message) ||
+ typed_array_message?(message)
+ end
+
VERIFYING_DOUBLE_OR_DOUBLE =
- /(RSpec::Mocks::(Instance|Class|Object)VerifyingDouble|(Instance|Class|Object)Double)/.freeze
+ /(RSpec::Mocks::(Instance|Class|Object)VerifyingDouble|(Instance|Class|Object)?Double)/.freeze
def double_message_with_ellipsis?(message)
message.include?('...') && message.match?(VERIFYING_DOUBLE_OR_DOUBLE)
end
@@ -64,10 +71,12 @@
message = opts.fetch(:pretty_message, opts.fetch(:message, ''))
if message.match?(VERIFYING_DOUBLE_OR_DOUBLE)
typing = opts[:type]
value = opts[:value].is_a?(Array) ? opts[:value].first : opts[:value]
- target = value.instance_variable_get(:@doubled_module).target
+ target = value.instance_variable_get(:@doubled_module)&.target
+
+ return if target.nil?
case typing
when T::Types::TypedArray, T::Types::TypedEnumerable
typing = typing.type
end