On Nov 23, 2010, at 7:12 PM, medihack wrote:

> Hello.
> 
> I am trying to test if in a method calling chain one of the methods
> get a specific parameter. In the below code for example MyModel must
> receive the parameter 0 for the method "offset". Unfortunately the
> code below does not work. It seems it is not possible to mix
> should_receive and stub_chain. How could I solve this?
> 
> MyModel.should_receive(:offset).with(0).stub_chain(:tag_counts, :offset, 
> :limit, :order).and_return([])
> # does not work!

As you're finding out, chains like this are hard to test. That, and the fact 
that writing code before tests significantly increases the likelihood that the 
code will be hard to test.

There is no easy way to do what you're trying to do with this code. You'd have 
to create a series of test doubles, like this:

offset_return_value = double
offset_return_value.stub_chain("limit.order") { [] }
tag_counts_return_value = double
tag_counts_return_value.should_receive(:offset).with(0).and_return(offset_return_value)
MyModel.stub(:tag_counts) { tag_counts_return_value }

The problem with this sort of structure, besides it being hard to read, is that 
you can't change anything about the implementation of the method that is 
invoking this chain without changing this example and likely many others.

I'd recommend wrapping that chain in a method and specifying how that method 
behaves when a 0 makes its way to the offset method vs how it behaves otherwise.

HTH,
David



> 
> Regards,
> Kai
> _______________________________________________
> rspec-users mailing list
> rspec-users@rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

Cheers,
David



_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to