[rspec-users] Controller Spec & DataMapper Chaining

Sid Wood sidwood2 at gmail.com
Sun Mar 20 03:56:02 EDT 2011


Thats great advice and now that you've pointed it out it seems so obvious.
Thanks Matt. See you at Cukeup!

Sid

On 19 March 2011 22:11, Matt Wynne <matt at mattwynne.net> wrote:

>
> 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
>
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20110320/5df75493/attachment.html>


More information about the rspec-users mailing list