[rspec-users] Controller Spec & DataMapper Chaining

Matt Wynne matt at mattwynne.net
Sat Mar 19 18:11:11 EDT 2011


On 19 Mar 2011, at 17:49, Sid Wood wrote:

> Thanks Ken, but when I said I was new to RSpec I didn't mean I was THAT new! ;o)
> 
> I think people aren't grasping the DataMapper chaining that is at the root of my testing confusion. I managed to come up with a solution that I've outlined here http://pastie.org/1690040
> 
> Basically, I mocked out a couple DataMapper::Collections and nested them. I'd love to hear if anyone would have tackled this issue differently. 

Yes, I would have listened to the tests here, and heard that the interface to my model was awkward.

I would either override Widget#all, or create a new method on the Widget that simply takes the params hash (or the three specific params new, name and materials) and figures out what to fetch from the database and returns it. You have data access concerns leaking out into your controller, which is why the interface is awkward to mock.

> 
> 
> On 18 March 2011 18:01, Ken Chien <ken.chien at gmail.com> wrote:
> When calling get/post/etc, the second optional parameter is a hash representing the "params" hash.
> 
> So, in order to test the conditional(s) in your controller, you should write:
>    get :index, :alpha => true  #test the first conditional
> 
> In another example, pass in :beta => true like this:
>     get :index, :beta => true
> 
> HTH,
> Ken
> 
> 
> 2011/3/18 Sid Wood <sidwood2 at gmail.com>
> Thanks for the replies guys. 
> 
> My problem is writing a test for 
> 
> @widgets = @widgets.by_alpha(params[:alpha])
> 
> DataMapper allows you to chain additional criteria on an existing query and doesnt execute that query until in is used in the view. So the above statement gets baked into the previous default query @widgets = Widget.all(:order => [ :name.asc ]).
> 
> I'd just like to write a test that confirms the controller is in fact calling @widgets.by_alpha(params[:alpha]) when the params[:alpha] is present. 
> 
> Here is the code again so you don't have to scroll to see it
> 
> 
> def index
>   @widgets = Widget.all(:order => [ :name.asc ])
>   if params[:alpha]
>     @widgets = @widgets.by_alpha(params[:alpha])
>   elsif params[:beta]
>     @widgets = @widgets.by_beta(params[:beta])
>   end
> end
> 
> Just to recap, this code is valid and works, I just don't know how to write a test for it. 
> 
> Cheers,
> 
> Sid
> 
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
> 
> 
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
> 
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

cheers,
Matt

matt at mattwynne.net
07974 430184

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20110319/5c66ad2a/attachment-0001.html>


More information about the rspec-users mailing list