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) 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