Re: params not available for controller specs?

Going back to my original message, I have the following at the beginning
of the download method:

def download
@orders = Order.find( params[:ids] )

The problem is that params[:ids], although built as an Array object by
the view that calls the download method on the controller, is passed as
a /-delimited string of id values. Order.find() will not do the desired
thing with that string, which was intended to be an array by the view,
but Rails passed it in a string representation. So the method really
should be

def download

@orders = Order.find( params[:ids].split( ‘/’ ) )

and what I’m trying to spec is the addition of the call to split().

Al

----- Original Message ----
From: Jarkko L. [email protected]
To: rspec-users [email protected]
Sent: Tuesday, December 4, 2007 7:31:11 AM
Subject: Re: [rspec-users] params not available for controller specs?

On 4.12.2007, at 17.13, Al Chou wrote:

Ah, thanks! That was a breakthrough. My mock object “ids_string”
isn’t receiving the method calls I expect (even though the code
under test actually does what I want it to do and works correctly),
but at least I’m past the params issue.

You don’t get the same object through the action queue, which is
another reason for not mocking something there. “string 1” is not
necessarily the same object as “string 1” and Rails will do a lot of
processing to the parameters before they end up in the params hash.

Just assume that a similar string will get passed through and spec
that the behaviour is what you expect.

What kind of method calls are you expecting/stubbing for a string?

//jarkko


Jarkko L.
http://jlaine.net
http://dotherightthing.com
http://www.railsecommerce.com
http://odesign.fi


rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

  ____________________________________________________________________________________

Never miss a thing. Make Yahoo your home page.

On 4.12.2007, at 18.19, Al Chou wrote:

Going back to my original message, I have the following at the
beginning of the download method:

def download
@orders = Order.find( params[:ids] )

The problem is that params[:ids], although built as an Array object
by the view that calls the download method on the controller, is
passed as a /-delimited string of id values.

If I set

<%= link_to “Test”, :controller => “clients”, :foo => [1, 2, 3, 4,
5] %>

I get this as the url:

http://localhost:3000/en/clients?foo[]=1&foo[]=2&foo[]=3&foo[]=4&foo[]=5

That will get correctly parsed back to an array in the receiving action:

Parameters: {“action”=>“index”, “foo”=>[“1”, “2”, “3”, “4”, “5”],
“controller”=>“clients”, “locale”=>“en”}

This is Edge Rails, though, so YMMV.

Order.find() will not do the desired thing with that string, which
was intended to be an array by the view, but Rails passed it in a
string representation. So the method really should be

def download
@orders = Order.find( params[:ids].split( ‘/’ ) )

and what I’m trying to spec is the addition of the call to split().

IMHO there’s no need to stub string methods like that. Just do
something like this:

Order.should_receive(:find).with(%w(1 2
3)).and_return(@some_order_objects)

If params[:ids] is “1/2/3”, you can be pretty certain that split("/")
will work correctly so you’re more interested in that the find method
gets called with correct set of attributes, an array. It’s not really
interesting how that array got to be. In this case, you might notice
that somehow params[:ids] is an array after all and you can take the
split call away, and the spec will still pass.

I guess what I’m trying to say is that the split call is part of the
controller action’s internal implementation, and you should be
spec’ing how it behaves related to its surrounding world: fetches
stuff from the business model, assigns objects for the view etc.

//jarkko


Jarkko L.
http://jlaine.net
http://dotherightthing.com
http://www.railsecommerce.com
http://odesign.fi

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs