On Aug 8, 2010, at 2:53 PM, christofferklang wrote:

> Hello,
> I'm new to rails and I'm trying to wrap my heads around how to spec 
> controllers using RSpec (using rails 3rc1 and rspec 2.0.0.beta.19).
> 
> The problem I've run into is when I want to test that my controllers respond 
> with a 404 for unfound records. Whenever I run the spec, the 
> ActiveRecord::RecordNotFound exception is not caught by rails, causing the 
> spec example to fail since the exception propagates out of the controller 
> into the spec.
> 
> >From googling around I get that rails only handles the exceptions and does a 
> >404 response when it's run in production mode, and that you need to call 
> >rescue_action_in_public! in your example if you want this behavior for test 
> >mode. However, this does not seem to do anything for me. The example still 
> >fails because the exception bubbles escapes unhandled from the controller.
> 
> Do I need to set something up for the rescue_action_in_public! to work? Or is 
> this not the correct way to test missing records?
> 
> My full example: (using factory_girl, rspec mocks and devise)
> 
> 
> it "respons with 404 when trying to edit non-existing reads" do
>    rescue_action_in_public!
>    sign_in(@user)
>    Read.should_receive(:find_by_id_and_user_id!).with(2, 
> @user.id).and_raise(ActiveRecord::RecordNotFound)
> 
>    get :edit, :id => 2
>    response.status.should eql 404
>  end
> 
> 
> and the exception:
> 1) ReadsController resources respons with 404 for non existing reads for GET 
> /reads/2/edit
>     Failure/Error: get :edit, :id => 2
>     ActiveRecord::RecordNotFound
It's up to you to handle the error in the controller. Something like this in 
ApplicationController:

  rescue_from ActiveRecord::RecordNotFound do
    render '/404.html', :layout => false, :status => :not_found
  end

HTH,
David

> Thanks, /Christoffer 

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to