[rspec-users] Setting expections on chained calls

Matt Wynne matt at mattwynne.net
Mon Nov 7 18:13:19 EST 2011


On 7 Nov 2011, at 18:37, Justin Ko wrote:

> On Nov 2, 2011, at 12:01 PM, Rob Aldred wrote:
> 
>> 
>> I'm pretty sure this has probably been discussed before.
>> I'm using couchdb (couchrest_model)
>> 
>> When speccing my controller i want to set expectations that im calling my couch views correctly.
>> The query interface has recently been updated to work very similar to ARel
>> 
>> This means i have to rewrite some of my specs.
>> 
>> Old call:
>> 
>>   Exam.by_created_at_and_not_archived(:start_key => [@exam.created_at], :endkey => ['0'],:limit => 2)
>> 
>> I set an expectation on that easily like so:
>> 
>>   Exam.should_receive(:by_created_at_and_not_archived).
>>         with(:startkey => [@exam1.created_at],:endkey => ['0'],:limit => 2).
>>         and_return([@exam1, at exam2])
>> 
>> However the new api i doesn't seem that easy to work with:
>> 
>>   Exam.by_created_at_and_not_archived.startkey([@exam.created_at]).endkey(['0']).limit(2)
>> 
>> I could use stub_chain, but that doesn't allow me to check the params being passes to the calls other than the last.
>> I could also create a wrapper method on my Exam model that is called from the controller with hash params,
>> however that just shifts the problem, I then have to check the expections in the model spec instead.
>> 
>> Suggestions on how best to go about that would be appreciated.
>> 
>> 
>> 
>> 
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
> 
> Exam.should_receive(:by_created_at_and_not_archived).and_return(
>  double('startkey').tap {|startkey|
>    startkey.should_receive(:startkey).with([@exam.created_at]).and_return(
>      double('endkey').tap {|endkey|
>        endkey.should_receive(:endkey).with(['0']).and_return(
>          double('limit').tap {|limit|
>            limit.should_receive(:limit).with(2).and_return([@exam1, @exam2])
>          }
>        )
>      }
>    )
>  }
> )
> 
> LOL, this is the ugliest code I've written all year. You'd might want to use variables for readability:

...or even wrap this Exam thing in an abstraction layer? Can anyone else hear the tests screaming?

:)

cheers,
Matt

--
Freelance programmer & coach
Author, http://pragprog.com/book/hwcuc/the-cucumber-book (with Aslak Hellesøy)
Founder, http://relishapp.com
+44(0)7974430184 | http://twitter.com/mattwynne



More information about the rspec-users mailing list