Christopher Bailey
2008-Oct-09 19:24 UTC
[rspec-users] Need help using URL helpers in controller tests
I have a controller test, where I want to do a GET on a page. Our URL''s are complex, and need to be correct (duh, but we allow some slop, but that causes a redirect which I want to avoid). Anyway, in my controller test I do a get to the URL that is produced by a helper method which calls a named route URL helper. This is not working, and I''m wondering why/what I''m messing up. Here''s the line in the spec code that starts things off (@widget is a real ActiveRecord object): get @controller.widget_path_for_seo(@widget) The widget_path_for_seo method is defined in our ApplicationController. It digs some info out of the widget instance that then get passed to the named route URL helper method, so it looks like this: def widget_path_for_seo(widget) location = seo_name_for_url widget.location.name building = seo_name_for_url(building_name_for_seo_url(widget.building), true) + "-widgets" widget_id = seo_name_for_url(widget.name) + "-" + widget.id.to_s seo_widget_path(:location => location, : building => building, :id => widget_id) end It''s the "seo_widget_path" named route helper method that is failing. I''ve checked that all values going into it are valid, but the error I get is in ActionController::Base.url_for, where it''s looking at the options hash of values that are passed in, and doing this: @url.rewrite(rewrite_options(options)) It compalins that @url is nil. I''m wondering if this is due to being run under the test environment or what I''m missing/not realizing, etc. What''s strange is that some of the restful resource route url helpers work fine. Can anyone clue me in? -- Christopher Bailey Cobalt Edge LLC http://cobaltedge.com -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081009/c723e17c/attachment.html>
Matt Wynne
2008-Oct-10 08:04 UTC
[rspec-users] Need help using URL helpers in controller tests
On 9 Oct 2008, at 20:24, Christopher Bailey wrote:> I have a controller test, where I want to do a GET on a page. Our > URL''s are complex, and need to be correct (duh, but we allow some > slop, but that causes a redirect which I want to avoid). Anyway, in > my controller test I do a get to the URL that is produced by a > helper method which calls a named route URL helper. This is not > working, and I''m wondering why/what I''m messing up. Here''s the line > in the spec code that starts things off (@widget is a real > ActiveRecord object): > > get @controller.widget_path_for_seo(@widget) > > The widget_path_for_seo method is defined in our > ApplicationController. It digs some info out of the widget instance > that then get passed to the named route URL helper method, so it > looks like this: > > def widget_path_for_seo(widget) > location = seo_name_for_url widget.location.name > building = > seo_name_for_url(building_name_for_seo_url(widget.building), true) + > "-widgets" > widget_id = seo_name_for_url(widget.name) + "-" + widget.id.to_s > > seo_widget_path(:location => location, : building => > building, :id => widget_id) > end > > It''s the "seo_widget_path" named route helper method that is > failing. I''ve checked that all values going into it are valid, but > the error I get is in ActionController::Base.url_for, where it''s > looking at the options hash of values that are passed in, and doing > this: > > @url.rewrite(rewrite_options(options)) > > It compalins that @url is nil. I''m wondering if this is due to > being run under the test environment or what I''m missing/not > realizing, etc. What''s strange is that some of the restful resource > route url helpers work fine. Can anyone clue me in? > > -- > Christopher Bailey > Cobalt Edge LLC > http://cobaltedge.comQuick thought - it doesn''t look like you have ''spun'' up the routes when you test this method. If you haven''t already made a get/post request through the rails integration session infrastructure the named routes don''t get loaded, and that can be quite confusing. I''m not sure if that could be the cause of your issue but I thought it was worth mentioning.
Christopher Bailey
2008-Oct-10 14:37 UTC
[rspec-users] Need help using URL helpers in controller tests
I''ve moved on from this with a bit different approach. But, I also found that the "get" (or whichever http method used) call expects the first parameter to be an action, so passing in a string that is a path or URL doesn''t work for that. On Fri, Oct 10, 2008 at 1:04 AM, Matt Wynne <matt at mattwynne.net> wrote:> > On 9 Oct 2008, at 20:24, Christopher Bailey wrote: > > I have a controller test, where I want to do a GET on a page. Our URL''s >> are complex, and need to be correct (duh, but we allow some slop, but that >> causes a redirect which I want to avoid). Anyway, in my controller test I >> do a get to the URL that is produced by a helper method which calls a named >> route URL helper. This is not working, and I''m wondering why/what I''m >> messing up. Here''s the line in the spec code that starts things off >> (@widget is a real ActiveRecord object): >> >> get @controller.widget_path_for_seo(@widget) >> >> The widget_path_for_seo method is defined in our ApplicationController. >> It digs some info out of the widget instance that then get passed to the >> named route URL helper method, so it looks like this: >> >> def widget_path_for_seo(widget) >> location = seo_name_for_url widget.location.name >> building = seo_name_for_url(building_name_for_seo_url(widget.building), >> true) + "-widgets" >> widget_id = seo_name_for_url(widget.name) + "-" + widget.id.to_s >> >> seo_widget_path(:location => location, : building => building, :id => >> widget_id) >> end >> >> It''s the "seo_widget_path" named route helper method that is failing. >> I''ve checked that all values going into it are valid, but the error I get >> is in ActionController::Base.url_for, where it''s looking at the options hash >> of values that are passed in, and doing this: >> >> @url.rewrite(rewrite_options(options)) >> >> It compalins that @url is nil. I''m wondering if this is due to being run >> under the test environment or what I''m missing/not realizing, etc. What''s >> strange is that some of the restful resource route url helpers work fine. >> Can anyone clue me in? >> >> -- >> Christopher Bailey >> Cobalt Edge LLC >> http://cobaltedge.com >> > > Quick thought - it doesn''t look like you have ''spun'' up the routes when you > test this method. If you haven''t already made a get/post request through the > rails integration session infrastructure the named routes don''t get loaded, > and that can be quite confusing. I''m not sure if that could be the cause of > your issue but I thought it was worth mentioning. > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >-- Christopher Bailey Cobalt Edge LLC http://cobaltedge.com -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081010/cc4624b1/attachment.html>
David Chelimsky
2008-Oct-10 15:40 UTC
[rspec-users] Need help using URL helpers in controller tests
On Fri, Oct 10, 2008 at 9:37 AM, Christopher Bailey <chris at cobaltedge.com> wrote:> I''ve moved on from this with a bit different approach. But, I also found > that the "get" (or whichever http method used) call expects the first > parameter to be an action, so passing in a string that is a path or URL > doesn''t work for that.That is correct. rspec delegates the get, post, put, delete, etc methods off to rails. In the case of controller examples, they work like rails functional tests. In the case of stories/features, they work like rails integration tests (which work differently).> > On Fri, Oct 10, 2008 at 1:04 AM, Matt Wynne <matt at mattwynne.net> wrote: >> >> On 9 Oct 2008, at 20:24, Christopher Bailey wrote: >> >>> I have a controller test, where I want to do a GET on a page. Our URL''s >>> are complex, and need to be correct (duh, but we allow some slop, but that >>> causes a redirect which I want to avoid). Anyway, in my controller test I >>> do a get to the URL that is produced by a helper method which calls a named >>> route URL helper. This is not working, and I''m wondering why/what I''m >>> messing up. Here''s the line in the spec code that starts things off >>> (@widget is a real ActiveRecord object): >>> >>> get @controller.widget_path_for_seo(@widget) >>> >>> The widget_path_for_seo method is defined in our ApplicationController. >>> It digs some info out of the widget instance that then get passed to the >>> named route URL helper method, so it looks like this: >>> >>> def widget_path_for_seo(widget) >>> location = seo_name_for_url widget.location.name >>> building >>> seo_name_for_url(building_name_for_seo_url(widget.building), true) + >>> "-widgets" >>> widget_id = seo_name_for_url(widget.name) + "-" + widget.id.to_s >>> >>> seo_widget_path(:location => location, : building => building, :id => >>> widget_id) >>> end >>> >>> It''s the "seo_widget_path" named route helper method that is failing. >>> I''ve checked that all values going into it are valid, but the error I get >>> is in ActionController::Base.url_for, where it''s looking at the options hash >>> of values that are passed in, and doing this: >>> >>> @url.rewrite(rewrite_options(options)) >>> >>> It compalins that @url is nil. I''m wondering if this is due to being run >>> under the test environment or what I''m missing/not realizing, etc. What''s >>> strange is that some of the restful resource route url helpers work fine. >>> Can anyone clue me in? >>> >>> -- >>> Christopher Bailey >>> Cobalt Edge LLC >>> http://cobaltedge.com >> >> Quick thought - it doesn''t look like you have ''spun'' up the routes when >> you test this method. If you haven''t already made a get/post request through >> the rails integration session infrastructure the named routes don''t get >> loaded, and that can be quite confusing. I''m not sure if that could be the >> cause of your issue but I thought it was worth mentioning. >> _______________________________________________ >> rspec-users mailing list >> rspec-users at rubyforge.org >> http://rubyforge.org/mailman/listinfo/rspec-users > > > > -- > Christopher Bailey > Cobalt Edge LLC > http://cobaltedge.com > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >