[rspec-users] hash form of stub_chain returning nil for chains with shared first message

David Chelimsky dchelimsky at gmail.com
Sat Feb 12 14:55:44 EST 2011


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

> On Feb 10, 7:30 pm, David Chelimsky <dchelim... at gmail.com> wrote:
>> On Feb 10, 2011, at 12:40 PM, Frederick Cheung 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. 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
> https://github.com/rspec/rspec-mocks/commit/2c23b86cc5aaa99557df456054765e95aa1a0d5a
> ) 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 (https://github.com/rspec/rspec-mocks/issues).

Thx,
David


> 
> Fred
> 
>> Cheers,
>> David
>> 
>> 
>> 
>> 
>> 
>>>    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
>> 
>>> _______________________________________________
>>> rspec-users mailing list
>>> rspec-us... at rubyforge.org
>>> http://rubyforge.org/mailman/listinfo/rspec-users
>> 
>> _______________________________________________
>> rspec-users mailing list
>> rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

Cheers,
David





More information about the rspec-users mailing list