receive_message_chain does not work with expect_any_instance_of
Created by: seanlinsley
This code causes RSpec to fail internally:
klass = Class.new
expect_any_instance_of(klass).to receive_message_chain(:a, :b).with 2
Here's the stack trace:
rspec-mocks-3.4.0/lib/rspec/mocks/any_instance/stub_chain.rb:40:in `verify_invocation_order'
rspec-mocks-3.4.0/lib/rspec/mocks/any_instance/chain.rb:103:in `record'
rspec-mocks-3.4.0/lib/rspec/mocks/any_instance/chain.rb:28:in `block in record'
rspec-mocks-3.4.0/lib/rspec/mocks/any_instance/proxy.rb:110:in `block in method_missing'
rspec-mocks-3.4.0/lib/rspec/mocks/any_instance/proxy.rb:110:in `map'
rspec-mocks-3.4.0/lib/rspec/mocks/any_instance/proxy.rb:110:in `method_missing'
rspec-mocks-3.4.0/lib/rspec/mocks/matchers/expectation_customization.rb:15:in `playback_onto'
rspec-mocks-3.4.0/lib/rspec/mocks/matchers/receive.rb:99:in `block in setup_method_substitute'
rspec-mocks-3.4.0/lib/rspec/mocks/matchers/receive.rb:98:in `each'
rspec-mocks-3.4.0/lib/rspec/mocks/matchers/receive.rb:98:in `setup_method_substitute'
rspec-mocks-3.4.0/lib/rspec/mocks/matchers/receive.rb:89:in `setup_any_instance_method_substitute'
rspec-mocks-3.4.0/lib/rspec/mocks/matchers/receive.rb:53:in `setup_any_instance_allowance'
rspec-mocks-3.4.0/lib/rspec/mocks/targets.rb:45:in `define_matcher'
rspec-mocks-3.4.0/lib/rspec/mocks/targets.rb:14:in `block in delegate_to'
And a pry session showing the internal state at the time:
From: /rspec-mocks-3.4.0/lib/rspec/mocks/any_instance/stub_chain.rb @ line 43 RSpec::Mocks::AnyInstance::StubChain#verify_invocation_order:
39: def verify_invocation_order(rspec_method_name, *_args, &_block)
40: return if invocation_order[rspec_method_name].include?(last_message)
41: raise NoMethodError, "Undefined method #{rspec_method_name}"
42: rescue => e
=> 43: binding.pry
44: end
[1] pry> e
=> #<NoMethodError: undefined method `include?' for nil:NilClass>
[2] pry> invocation_order
=> {:and_return=>[nil], :and_raise=>[nil], :and_yield=>[nil]}
[3] pry> rspec_method_name
=> :with
[4] pry> last_message
=> nil