From 3829d7af79a096ccc069ee7d4af0195a46fe7255 Mon Sep 17 00:00:00 2001 From: Jon Rowe Date: Tue, 1 Oct 2024 22:00:47 +0100 Subject: [PATCH 1/2] Support keyword arguments with and_invoke --- lib/rspec/mocks/message_expectation.rb | 1 + spec/rspec/mocks/and_invoke_spec.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/rspec/mocks/message_expectation.rb b/lib/rspec/mocks/message_expectation.rb index 8376a1c7a..1ecfa3e8a 100644 --- a/lib/rspec/mocks/message_expectation.rb +++ b/lib/rspec/mocks/message_expectation.rb @@ -748,6 +748,7 @@ def call(*args, &block) proc.call(*args, &block) end + ruby2_keywords(:call) if respond_to?(:ruby2_keywords, true) end # Represents a configured implementation. Takes into account diff --git a/spec/rspec/mocks/and_invoke_spec.rb b/spec/rspec/mocks/and_invoke_spec.rb index cafa16d3e..5a4f2fd3a 100644 --- a/spec/rspec/mocks/and_invoke_spec.rb +++ b/spec/rspec/mocks/and_invoke_spec.rb @@ -39,6 +39,18 @@ module Mocks expect(dbl.square_then_cube(2)).to eq 4 expect(dbl.square_then_cube(2)).to eq 8 end + + if RSpec::Support::RubyFeatures.kw_args_supported? + binding.eval(<<-RUBY, __FILE__, __LINE__) + it 'passes keyword arguments into the callable' do + expect(dbl).to receive(:square_then_cube).and_invoke(lambda { |i: 1| i ** 2 }, + lambda { |i: 1| i ** 3 }) + + expect(dbl.square_then_cube(i: 2)).to eq 4 + expect(dbl.square_then_cube(i: 2)).to eq 8 + end + RUBY + end end end end From ce4993254e9e0bd742adbfcbaa51857d2b867f2e Mon Sep 17 00:00:00 2001 From: Jon Rowe Date: Tue, 1 Oct 2024 22:21:01 +0100 Subject: [PATCH 2/2] Changelog for #1595 --- Changelog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Changelog.md b/Changelog.md index 1a70ec021..d23c5dfaf 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,10 @@ ### Development [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.13.1...main) +Bug Fixes: + +* Support keyword arguments in callables passed to `and_invoke`. (Jon Rowe, #1595) + ### 3.13.1 / 2024-05-08 [Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.13.0...v3.13.1)