GET a path in a controller spec

One of my controller actions sends a redirect if the request URI begins
with /foods/search

34 def search
35 return redirect_to “/#{params[:name]}” if
request.request_uri.match /^/foods/search/

Unfortunately, I can’t figure out how to spec this.

From everything that I’ve read while researching this problem, it seems
that #get and #post only accept the action to call, and a hash of
parameters. IE:
get :action, :some => ‘param’
As a result, I can’t do this:
121 it ‘redirects /foods/search/almonds to /almonds’ do
122 get ‘/foods/search/almonds’
123 response.should redirect_to “/almonds”
124 end

How can I spec this?

Thanks for your help,
Nick

On Sun, Jan 31, 2010 at 17:02, Nick H. [email protected]
wrote:

One of my controller actions sends a redirect if the request URI begins
with /foods/search

34 def search
35 return redirect_to “/#{params[:name]}” if
request.request_uri.match /^/foods/search/

Unfortunately, I can’t figure out how to spec this.

Do you want to check that search redirects, or the algorithm for
computing the redirect path? I would probably check the algorithm
separately, then stub the algorithm to check the redirect.

J. B. (Joe) Rainsberger :: http://www.jbrains.ca ::
http://blog.thecodewhisperer.com
Diaspar Software Services :: http://www.diasparsoftware.com
Author, JUnit Recipes
2005 Gordon Pask Award for contribution to Agile practice :: Agile
2010: Learn. Practice. Explore.

On 31 January 2010 22:02, Nick H. [email protected] wrote:

that #get and #post only accept the action to call, and a hash of
Thanks for your help,
Nick

Posted via http://www.ruby-forum.com/.


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

You might find this easier to do as an integration test. I’d use
cucumber
for this. Personally I think speccing controllers is pretty hard for the
benefits it gives, and if you keep your controllers real simple and thin
and
use cucumber you can discard most controller specs.

Extract redirect logic to an object or helper and test that.

UrlRewriter.new.rewrite(’/foods/search/almonds’).should == ‘/almonds’
helper.rewrite_url(’/foods/search/almonds’).should == ‘/almonds’

and then you will see that this should probably be called higher up in
the call stack, in a before_filter. Or even higher up, at your web
server, nullifying the need for any ruby code in the first place.

Cucumber works, too. “There’s more than one way to kill a cat than by
stuffing it with butter.”

Pat