On Tue, Jun 16, 2009 at 3:07 PM, <r_j_h_box...@yahoo.com> wrote: > > I finally figured this out. > > lambda { route_for(:controller => "designs", :action => "create").should == > "anything" }.should raise_error( ActionController::RoutingError ) > > The clue was that I wasn't getting a routing error until I tried to compare > route_for() with something. route_for() seems to generate an object that > overrides ==(), and at that time it does raise the exception. Now we wrap > that comparison in a lambda and assert that the *comparison* should raise the > expected routing error. > > So - great, we can actually test it. But the syntax does leave something to > be desired. dchelimsky, can you recommend any alternatives that would be a > bit cleaner for testing that a route doesn't exist? >
You don't need the .should == "anything" in there. So this is a bit cleaner: lambda { route_for(:controller => "designs", :action => "create") }.should raise_error( ActionController::RoutingError ) Also, since rspec-1.2.5 you can use expect/to: expect { route_for(:controller => "designs", :action => "create") }.to raise_error( ActionController::RoutingError ) You could always kick it old-school: e = nil begin route_for(:controller => "designs", :action => "create") rescue ActionController::RoutingError => e ensure e.should_not be_nil end And you could always wrap this in an new matcher: def be_routable Spec::Matchers.new :be_routable, self do |example| match do |params| e = nil begin example.route_for(params) rescue ActionController::RoutingError => e end !!e end end end {:controller => "designs", :action => "create"}.should_not be_routable In this case you need to wrap the matcher's construction in a method in order to provide access to the scope of the example (which is where route_for lives). Also, I just whipped that up off the top of my head - no idea if it actually works :) HTH, David > Thanks, > > Randy > > > > > ----- Original Message ---- >> From: Ben Mabey <b...@benmabey.com> >> To: r_j_h_box...@yahoo.com; rspec-users <rspec-users@rubyforge.org> >> Sent: Friday, May 8, 2009 10:25:03 AM >> Subject: Re: [rspec-users] Problem verifying routing error >> >> Randy Harmon wrote: >> > Hi, >> > >> > When upgrading to rspec/rspec-rails 1.2.6 gem (from 1.1.12), I'm having >> > a new problem verifying routes that should not exist. >> > >> > This is to support something like this in routes.rb: >> > >> > map.resources :orders do |orders| >> > orders.resources :items, :except => [:index,:show] >> > end >> > >> > I used to use lambda {}.should_raise( routing error ), but it stopped >> > detecting any raised error. Requesting it through the browser produces >> > ActionController::MethodNotAllowed (Only post requests are allowed). But >> > that error wasn't detected. >> > >> > When I skip the lambda, and just ask it to verify that the route does >> > exist (which *should* fail), I get the same result for those :except >> > actions as for a made-up action name. Seems this must have something to >> > do with the change in how route_for delegates back to ActionController's >> > routing assertion (sez the backtrace :). >> > >> > >> > NoMethodError in 'ItemsController route generation should NOT map >> > #indewfefwex' >> > You have a nil object when you didn't expect it! >> > You might have expected an instance of Array. >> > The error occurred while evaluating nil.first >> > >> /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/assertions/routing_assertions.rb:134:in >> > `recognized_request_for' >> > >> /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/assertions/routing_assertions.rb:49:in >> > `assert_recognizes' >> > >> /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/assertions.rb:54:in >> > `clean_backtrace' >> > >> /Library/Ruby/Gems/1.8/gems/actionpack-2.2.2/lib/action_controller/assertions/routing_assertions.rb:47:in >> > `assert_recognizes' >> > ./spec/controllers/thoughts_routing_spec.rb:9: >> > >> > >> > I tried using bypass_rescue in my routing/items_routing_spec.rb file as >> > mentioned by the upgrade doc, but it wasn't valid in the "routing" spec >> > - worked fine when I moved the file back to spec/controllers/, though. >> > Seems like that's not the issue, but I'm mentioning for more completeness. >> > >> > Any ideas what I should be doing instead, or how I can troubleshoot >> > further? >> > >> >> >> Hmm.. yeah, it seems like it might have to do with how the exceptions >> are being handled in the newer version of rspec-rials (see >> https://rspec.lighthouseapp.com/projects/5645/tickets/85-11818-have-mode-for-rails-error-handling). >> >> I don't use RSpec to verify my routes very often and have never used it >> to verify the non-existence of a route so I'm afraid I don't really have >> any ideas... >> >> Does anyone else have an idea to do this? >> >> -Ben > > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users > _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users