Support ruby-head/2.8
Created by: p-mongo
ruby-head does not pass keyword arguments, making this test fail:
class Foo def m(a, b: nil) p [a, b] end end describe 'foo' do it 'bars' do expect_any_instance_of(Foo).to receive(:m).and_call_original Foo.new.m(1, b: 2) end end
Failures: 1) foo bars Failure/Error: def m(a, b: nil) p [a, b] end ArgumentError: wrong number of arguments (given 2, expected 1) # ./test.rb:5:in `m' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/message_expectation.rb:102:in `call' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/message_expectation.rb:102:in `block in and_call_original' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/message_expectation.rb:743:in `call' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/message_expectation.rb:574:in `invoke_incrementing_actual_calls_by' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/message_expectation.rb:428:in `invoke' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/proxy.rb:202:in `message_received' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/proxy.rb:348:in `message_received' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/method_double.rb:77:in `proxy_method_invoked' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/method_double.rb:64:in `block (2 levels) in define_proxy_method' # /home/me/apps/exp/rspec-mocks/lib/rspec/mocks/any_instance/recorder.rb:262:in `block in observe!' # ./test.rb:14:in `block (2 levels) in ' # /home/me/apps/exp/rspec-core/lib/rspec/core/example.rb:257:in `instance_exec' # /home/me/apps/exp/rspec-core/lib/rspec/core/example.rb:257:in `block in run' # /home/me/apps/exp/rspec-core/lib/rspec/core/example.rb:503:in `block in with_around_and_singleton_context_hooks' # /home/me/apps/exp/rspec-core/lib/rspec/core/example.rb:460:in `block in with_around_example_hooks' # /home/me/apps/exp/rspec-core/lib/rspec/core/hooks.rb:481:in `block in run'
Proposed solution is to take *args and **opts separately in all methods.