I’m trying to spec a dead simple “show non-existent record should render
404” case, but it seems the RecordNotFound exception is making it
impossible for some reason.
#controller
def show
@event = Event.find(params[:id])
end
#spec - pretty much straight from the rspec site
before do
Event.stub!(:find)
get :show, :id => ‘broken’
end
passes
it “should not assign an event” do
assigns[:event].should == nil
end
fails - expected 404 but got events/show
it “should render 404” do
response.should render_template("#{RAILS_ROOT}/public/404.html")
response.response_code.should == 404
end
#end spec
Because I’m stubbing find does that mean the RecordNotFound exception
doesn’t happen and thus the 404 doesn’t render? I tried stubbing and
using should_raise, and_raise, whatever the heck it is, but I just don’t
get it, nothing seems to work. It behaves as expected when browser
tested!
I’m going to spontaneously combust!
[RSpec 1.1.2, Rails 2.0.2, ZenTest 3.8.0]
Try
Event.stub!(:find).and_raise(RecordNotFound)
Pat M. wrote:
Try
Event.stub!(:find).and_raise(RecordNotFound)
To my credit, I did try that (though ActiveRecord::RecordNotFound, of
course) but then I get:
EventsController attempt to show non-existing event
- should render 404 (ERROR - 2)
- should not assign an event (ERROR - 3)
ActiveRecord::RecordNotFound in ‘EventsController attempt to show
non-existing event should render 404’
ActiveRecord::RecordNotFound
Mind-boggling.
On 13.2.2008, at 21.09, Brad C. [email protected] wrote:
- should not assign an event (ERROR - 3)
ActiveRecord::RecordNotFound in ‘EventsController attempt to show
non-existing event should render 404’
ActiveRecord::RecordNotFound
Mind-boggling.
The exception is never rescued. You’d have to catch the exception
yourself, I think, and render the 404 page. I might be talking through
my ass but I think the built in rescue of AR::RNF only works in
production.
//jarkko
Jarkko L. wrote:
On 13.2.2008, at 21.09, Brad C. [email protected] wrote:
- should not assign an event (ERROR - 3)
ActiveRecord::RecordNotFound in ‘EventsController attempt to show
non-existing event should render 404’
ActiveRecord::RecordNotFound
Mind-boggling.
The exception is never rescued. You’d have to catch the exception
yourself, I think, and render the 404 page. I might be talking through
my ass but I think the built in rescue of AR::RNF only works in
production.
//jarkko
I was led to believe Rails automatically handled RecordNotFounds with a
404, meaning I didn’t have to catch them myself.
I made sure requests weren’t considered local in the test environment to
trigger the 404 page instead of the debug info. I tried putting a
rescue_action_in_public in the application controller to handle the
RecordNotFound and do the 404 render, just in case, but the spec won’t
pass unless I rescue the exception inside the show method, which doesn’t
seem right or necessary.
I was led to believe Rails automatically handled RecordNotFounds with a
404, meaning I didn’t have to catch them myself.
I made sure requests weren’t considered local in the test environment to
trigger the 404 page instead of the debug info. I tried putting a
rescue_action_in_public in the application controller to handle the
RecordNotFound and do the 404 render, just in case, but the spec won’t
pass unless I rescue the exception inside the show method, which doesn’t
seem right or necessary.
Aha! Had to use: controller.use_rails_error_handling!
Here’s the complete spec:
http://pastie.caboo.se/151743
As per the pasite, requests have to be non-local.
Thank you to everyone who pitched in to help!