Hash form of stub_chain returning nil for chains with shared first message

I’m new using rspec, so please forgive me if I’m barking up the wrong
tree, but…

I’d expect this to pass (using rspec 2.5.1)

describe ‘stub_chain’ do
it “returns expected value from two chains with hash” do
subject = Object.new
subject.stub_chain(:msg1, :msg2 => :first)
subject.stub_chain(:msg1, :msg3 => :second)
subject.msg1.msg2.should equal(:first)
subject.msg1.msg3.should equal(:second)
end
end

But it doesn’t - subject.msg1.msg3 returns nil

I think this is because in stub_chain (in
rspec-mocks/lib/rspec/mocks/methods.rb, line 43) there is

if matching_stub = __mock_proxy.send(:find_matching_method_stub,
chain[0].to_sym)
chain.shift
matching_stub.invoke.stub_chain(*chain)
else

ie blk isn’t used in any way. Changing this to
matching_stub.invoke.stub_chain(*chain, &blk) makes my example pass
Is this true or am I just misusing rspec?

Fred

On Feb 10, 2011, at 12:40 PM, Frederick C. wrote:

I’m new using rspec, so please forgive me if I’m barking up the wrong tree,
but…

I’d expect this to pass (using rspec 2.5.1)

describe ‘stub_chain’ do
it “returns expected value from two chains with hash” do
subject = Object.new
subject.stub_chain(:msg1, :msg2 => :first)
subject.stub_chain(:msg1, :msg3 => :second)

This ^^ is not documented to work. See
http://relishapp.com/rspec/rspec-mocks/v/2-5/dir/method-stubs/stub-a-chain-of-methods.

Try:

subject.stub_chain(:msg1, :msg2).and_return(:first)

If that works, feel free to submit a feature request to support the
format you were using.

Cheers,
David

subject.msg1.msg2.should equal(:first)
subject.msg1.msg3.should equal(:second)
end
end

On Feb 10, 7:30pm, David C. [email protected] wrote:

subject.stub_chain(:msg1, :msg3 => :second)

This ^^ is not documented to work.
Seehttp://relishapp.com/rspec/rspec-mocks/v/2-5/dir/method-stubs/stub-a-…

Try:

subject.stub_chain(:msg1, :msg2).and_return(:first)

If that works, feel free to submit a feature request to support the format you
were using.

Fair enough. I’d been reading stub_chain_spec.rb (which does do stuff
like @subject.stub_chain(:msg1, :msg2, :msg3, :msg4 => :return_value))
rather than stub_chain.feature and had taken that (as well as

) to mean that subject.stub_chain(:msg1, :msg2 => :first) was official

Fred

On Feb 11, 2011, at 7:51 AM, Frederick C. wrote:

subject.stub_chain(:msg1, :msg2 => :first)

Fair enough. I’d been reading stub_chain_spec.rb (which does do stuff
like @subject.stub_chain(:msg1, :msg2, :msg3, :msg4 => :return_value))
rather than stub_chain.feature and had taken that (as well as

) to mean that subject.stub_chain(:msg1, :msg2 => :first) was official

I was wrong. I’d consider this documented, and that what you are
experiencing is a bug.

Please submit an issue (Issues · rspec/rspec-mocks · GitHub).

Thx,
David

subject.msg1.msg2.should equal(:first)
matching_stub.invoke.stub_chain(*chain)
http://rubyforge.org/mailman/listinfo/rspec-users


rspec-users mailing list
[email protected]://rubyforge.org/mailman/listinfo/rspec-users


rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Cheers,
David

On Feb 12, 2011, at 5:55 PM, David C. wrote:

describe ‘stub_chain’ do

Please submit an issue (Issues · rspec/rspec-mocks · GitHub).

FYI - I’ve already fixed this:

Feel free to submit an issue anyhow if you like, and I’ll note this
commit in the issue.

Cheers,
David

On Feb 12, 8:43pm, David C. [email protected] wrote:

I was wrong. I’d consider this documented, and that what you are experiencing
is a bug.

Please submit an issue (Issues · rspec/rspec-mocks · GitHub).

FYI - I’ve already fixed
this:fix bug in which multiple chains with shared messages ending in hashes · rspec/rspec-mocks@ca2d837 · GitHub

Feel free to submit an issue anyhow if you like, and I’ll note this commit in
the issue.

Sweet! I created hash form of stub_chain returning nil for chains with shared first message Options · Issue #38 · rspec/rspec-mocks · GitHub
(and nice to see that the fix was what I thought it was!)

Fred