On Tue, Nov 08, 2011 at 12:36:22AM +0000, Justin Ko wrote:
> 
> On Nov 7, 2011, at 4:13 PM, Matt Wynne wrote:
> 
> > 
> > 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,@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@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?
> 
> Personally, I wouldn't mock this code at all. It's a data retrieval method, 
> let it hit CouchDB (abstracted or not).
> 
> > 
> > :)
> > 
> > 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
> > 
> > _______________________________________________
> > rspec-users mailing list
> > rspec-users@rubyforge.org
> > http://rubyforge.org/mailman/listinfo/rspec-users
> 
> _______________________________________________
> rspec-users mailing list
> rspec-users@rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users


Heh, that's magic.
So maybe it's just better to create the documents in couch...
I'm happy to do that, I just figured it would drastically effect performance of 
the tests.

Rob

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

Reply via email to