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