From 0f5260320cd8b005339c26e1e7da3389ee7a3c49 Mon Sep 17 00:00:00 2001 From: Jon Rowe Date: Fri, 13 Aug 2021 21:16:28 +0100 Subject: [PATCH 1/3] Declare ruby2_keywords for a method_missing implementation in controller specs --- lib/rspec/rails/example/controller_example_group.rb | 1 + .../rails/example/controller_example_group_spec.rb | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/rspec/rails/example/controller_example_group.rb b/lib/rspec/rails/example/controller_example_group.rb index 3150f3d469..636a194a11 100644 --- a/lib/rspec/rails/example/controller_example_group.rb +++ b/lib/rspec/rails/example/controller_example_group.rb @@ -176,6 +176,7 @@ def method_missing(method, *args, &block) super end end + ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true) included do subject { controller } diff --git a/spec/rspec/rails/example/controller_example_group_spec.rb b/spec/rspec/rails/example/controller_example_group_spec.rb index 56b53049d1..ff0d087809 100644 --- a/spec/rspec/rails/example/controller_example_group_spec.rb +++ b/spec/rspec/rails/example/controller_example_group_spec.rb @@ -19,6 +19,19 @@ def group_for(klass) expect(group.included_modules).to include(RSpec::Rails::Matchers::RoutingMatchers) end + it "handles methods invoked via `method_missing` that use keywords" do + group = + RSpec::Core::ExampleGroup.describe ApplicationController do + def a_method(value:); value; end + def method_missing(_name, *_args, **kwargs, &_block); a_method(**kwargs); end + + prepend ControllerExampleGroup + end + example = group.new + + expect(example.call_a_method(value: :value)).to eq :value + end + context "with implicit subject" do it "uses the controller as the subject" do controller = double('controller') From eba671916ce0a7190394dc383ee6d7b0639b743d Mon Sep 17 00:00:00 2001 From: Jon Rowe Date: Fri, 13 Aug 2021 22:02:34 +0100 Subject: [PATCH 2/3] Documentation for spec demonstrating method_missing issue --- spec/rspec/rails/example/controller_example_group_spec.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/rspec/rails/example/controller_example_group_spec.rb b/spec/rspec/rails/example/controller_example_group_spec.rb index ff0d087809..fa524b0fcf 100644 --- a/spec/rspec/rails/example/controller_example_group_spec.rb +++ b/spec/rspec/rails/example/controller_example_group_spec.rb @@ -25,6 +25,10 @@ def group_for(klass) def a_method(value:); value; end def method_missing(_name, *_args, **kwargs, &_block); a_method(**kwargs); end + # This example requires prepend so that the `method_missing` definition + # from `ControllerExampleGroup` bubbles up to our artificial one, in reality + # this is likely to be either an internal RSpec dispatch or one from a 3rd + # party gem. prepend ControllerExampleGroup end example = group.new From 69571886e295672f0457e28c0ef0b6646e747935 Mon Sep 17 00:00:00 2001 From: Jon Rowe Date: Fri, 13 Aug 2021 22:02:50 +0100 Subject: [PATCH 3/3] Changelog for #2509, #2514 --- Changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.md b/Changelog.md index e268120cb0..ddb9defc3b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -13,6 +13,8 @@ Bug Fixes: * Fix `ActiveRecord::TestFixture#uses_transaction` by using example description to replace example name rather than example in our monkey patched `run_in_transaction?` method. (Stan Lo, #2495) +* Prevent keyword arguments being lost when methods are invoked dynamically + in controller specs. (Josh Cheek, #2509, #2514) ### 5.0.1 / 2021-03-18 [Full Changelog](https://github.com/rspec/rspec-rails/compare/v5.0.0...v5.0.1)