From 9e8cf14504f4f765b30052facc887cf2026d108e Mon Sep 17 00:00:00 2001 From: Phil Pirozhkov Date: Wed, 11 Jan 2023 01:04:52 +0300 Subject: [PATCH] Don't convert keywords to hash in #send for verifying doubles on Ruby 3 (#1520) * Don't convert keywords to hash in #send for verifying doubles on Ruby 3 Co-authored-by: Charlie Honig --- Changelog.md | 5 +++++ lib/rspec/mocks/verifying_double.rb | 2 ++ .../verifying_doubles/expected_arg_verification_spec.rb | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/Changelog.md b/Changelog.md index 1cf34814d..88f2b4a3e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,11 @@ ### Development [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.1...3-12-maintenance) +Bug Fixes: + +* Fix keyword delegation in `send` for verifying doubles on Ruby 3. + (Charlie Honig, #1485) + ### 3.12.2 / 2023-01-07 [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.1...v3.12.2) diff --git a/lib/rspec/mocks/verifying_double.rb b/lib/rspec/mocks/verifying_double.rb index e75478f9f..31f7c6e21 100644 --- a/lib/rspec/mocks/verifying_double.rb +++ b/lib/rspec/mocks/verifying_double.rb @@ -42,11 +42,13 @@ def __send__(name, *args, &block) ensure @__sending_message = nil end + ruby2_keywords :__send__ if respond_to?(:ruby2_keywords, true) $VERBOSE = old def send(name, *args, &block) __send__(name, *args, &block) end + ruby2_keywords :send if respond_to?(:ruby2_keywords, true) def initialize(doubled_module, *args) @doubled_module = doubled_module diff --git a/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb b/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb index b2a7c2cc9..d39995341 100644 --- a/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb +++ b/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb @@ -143,6 +143,15 @@ module Mocks dbl.kw_args_method(1, {:required_arg => 2, :optional_arg => 3}) end end + + context "when using `send`" do + let(:dbl) { instance_double(Class.new { eval "def m(k:); end" }) } + + it "matches against keyword arguments" do + expect(dbl).to receive(:m).with(:k => 1) + dbl.send(:m, :k => 1) + end + end end end end