diff --git a/lib/flexmock/partial_mock.rb b/lib/flexmock/partial_mock.rb index 0451480..e4cf254 100644 --- a/lib/flexmock/partial_mock.rb +++ b/lib/flexmock/partial_mock.rb @@ -276,7 +276,7 @@ def initialize_stub(recorder, expectations_block) expectation_blocks = @initialize_expectation_blocks = Array.new expectation_recorders = @initialize_expectation_recorders = Array.new @initialize_override = Module.new do - define_method :initialize do |*args, **kw, &block| + define_method :initialize do |*args, &block| if self.class.respond_to?(:__flexmock_proxy) && (mock = self.class.__flexmock_proxy) container = mock.flexmock_container mock = container.flexmock(self) @@ -287,12 +287,8 @@ def initialize_stub(recorder, expectations_block) r.apply(mock) end end - if kw.empty? - # Workaround kw arg support for ruby < 2.7 - super(*args, &block) - else - super(*args, **kw, &block) - end + # Workaround kw arg support for ruby < 2.7 + super(*args, &block) end end override = @initialize_override diff --git a/test/partial_mock_test.rb b/test/partial_mock_test.rb index 946cac3..805cdf2 100644 --- a/test/partial_mock_test.rb +++ b/test/partial_mock_test.rb @@ -797,5 +797,60 @@ def test_interaction_between_signature_verification_and_based_partials FlexMock.partials_are_based = false FlexMock.partials_verify_signatures = false end -end + class InitializeWithKwargs + attr_reader :some, :args, :kw + + def initialize(some, args, **kw) + @some = some + @args = args + @kw = kw + end + end + + def test_initialize_stub_handles_keyword_arguments_on_initialize + flexmock(InitializeWithKwargs) + .new_instances.should_receive(:test) + obj = InitializeWithKwargs.new(21, 42, kw: 84) + assert_equal 21, obj.some + assert_equal 42, obj.args + assert_equal({ kw: 84 }, obj.kw) + end + + def test_initialize_stub_handles_empty_keyword_arguments_on_initialize + flexmock(InitializeWithKwargs) + .new_instances.should_receive(:test) + obj = InitializeWithKwargs.new(21, 42) + assert_equal 21, obj.some + assert_equal 42, obj.args + assert_equal({}, obj.kw) + end + + class InitializeWithTrailingHashArg + attr_reader :some, :args, :kw + + def initialize(some, args, kw) + @some = some + @args = args + @kw = kw + end + end + + def test_initialize_stub_handles_a_trailing_hash_on_initialize + flexmock(InitializeWithTrailingHashArg) + .new_instances.should_receive(:test) + obj = InitializeWithTrailingHashArg.new(21, 42, kw: 84) + assert_equal 21, obj.some + assert_equal 42, obj.args + assert_equal({ kw: 84 }, obj.kw) + end + + def test_initialize_stub_handles_an_empty_trailing_hash_on_initialize + flexmock(InitializeWithTrailingHashArg) + .new_instances.should_receive(:test) + obj = InitializeWithTrailingHashArg.new(21, 42, {}) + assert_equal 21, obj.some + assert_equal 42, obj.args + assert_equal({}, obj.kw) + end +end