Lalish-Menagh, Trevor
2010-Jul-03 06:40 UTC
[rspec-users] Help with nested routes test in Rails 3
Hi all, I must be doing something wrong here. Could someone point me in the right direction? I am trying to test my nested resources in Rails 3. The route: resources :students do resources :days end The test: it "recognizes and generates #index" do { :get => "/students/1/days" }.should route_to(:controller => "days", :action => "index", :student_id => "1") end The error: 1) DaysController routing nested in students recognizes and generates #index Failure/Error: { :get => "/students/1/days" }.should route_to(:student_id => "1", :controller => "days", :action => "index") found extras <{:student_id=>"1"}>, not <{}> The route works find in the browser, I just don''t know what I am missing to make the test pass. Yours, Trevor -- Trevor Lalish-Menagh 484.868.6150 mobile trev at trevreport.org http://www.trevmex.com/
Lalish-Menagh, Trevor
2010-Jul-04 20:28 UTC
[rspec-users] Help with nested routes test in Rails 3
Hi again, I figured out the issue. RSpec''s route_to wraps Rails'' assert_routing, which checks two things: - Rails recognizes the given path and routes it to a particular spot in your application (via assert_recognizes) - a particular set of options generate a particular path (via assert_generates) The problem (in my example below) is that the set of options given: {:controller => "days", :action => "index", :student_id => "1"} generates the path: "/days" not: "/student/1/days" Rails doesn''t take into account the foreign key of nested resources when generating a path from a set of options. Now that I understand this, I can write a test just using assert_recognizes that passes: assert_recognizes({:controller => "days", :action => "index", :student_id => "1"}, "/students/1/days") Hooray! I hope this helps someone else out there. It was really confusing me. Yours, Trevor On Sat, Jul 3, 2010 at 2:40 AM, Lalish-Menagh, Trevor <trev at trevreport.org> wrote:> Hi all, > > I must be doing something wrong here. Could someone point me in the > right direction? I am trying to test my nested resources in Rails 3. > > The route: > ?resources :students do > ? ?resources :days > ?end > > The test: > ? ? ?it "recognizes and generates #index" do > ? ? ? ?{ :get => "/students/1/days" }.should route_to(:controller => > "days", :action => "index", :student_id => "1") > ? ? ?end > > The error: > 1) DaysController routing nested in students recognizes and generates #index > ? ?Failure/Error: { :get => "/students/1/days" }.should > route_to(:student_id => "1", :controller => "days", :action => > "index") > ? ?found extras <{:student_id=>"1"}>, not <{}> > > The route works find in the browser, I just don''t know what I am > missing to make the test pass. > > Yours, > Trevor > -- > Trevor Lalish-Menagh > 484.868.6150 mobile > trev at trevreport.org > http://www.trevmex.com/ >-- Trevor Lalish-Menagh 484.868.6150 mobile trev at trevreport.org http://www.trevmex.com/
David Chelimsky
2010-Jul-05 12:04 UTC
[rspec-users] Help with nested routes test in Rails 3
On Jul 4, 2010, at 3:28 PM, Lalish-Menagh, Trevor wrote:> > On Sat, Jul 3, 2010 at 2:40 AM, Lalish-Menagh, Trevor > <trev at trevreport.org> wrote: >> Hi all, >> >> I must be doing something wrong here. Could someone point me in the >> right direction? I am trying to test my nested resources in Rails 3. >> >> The route: >> resources :students do >> resources :days >> end >> >> The test: >> it "recognizes and generates #index" do >> { :get => "/students/1/days" }.should route_to(:controller => >> "days", :action => "index", :student_id => "1") >> end >> >> The error: >> 1) DaysController routing nested in students recognizes and generates #index >> Failure/Error: { :get => "/students/1/days" }.should >> route_to(:student_id => "1", :controller => "days", :action => >> "index") >> found extras <{:student_id=>"1"}>, not <{}> >> >> The route works find in the browser, I just don''t know what I am >> missing to make the test pass. >> >> Yours, >> Trevor > Hi again, > > I figured out the issue. RSpec''s route_to wraps Rails'' assert_routing, > which checks two things: > - Rails recognizes the given path and routes it to a particular spot > in your application (via assert_recognizes) > - a particular set of options generate a particular path (via assert_generates) > > The problem (in my example below) is that the set of options given: > {:controller => "days", :action => "index", :student_id => "1"} > generates the path: > "/days" > not: > "/student/1/days" > > Rails doesn''t take into account the foreign key of nested resources > when generating a path from a set of options. > > Now that I understand this, I can write a test just using > assert_recognizes that passes: > assert_recognizes({:controller => "days", :action => "index", > :student_id => "1"}, "/students/1/days") > > Hooray! > > I hope this helps someone else out there. It was really confusing me. > > Yours, > TrevorPlease join the conversation about improving the API for routing specs: http://groups.google.com/group/rspec/browse_thread/thread/50b46ca3e4bd3a78 Cheers, David