RecordNotFound raised when using find_by_id to get non-existent record in RSpec

我的未来我决定 提交于 2019-12-12 10:48:16

问题


I've written this spec in products_controller_spec.rb, that is intended to test a redirect when destroy is called on a non-existent record:

it "deleting a non-existent product should redirect to the user's profile page with a flash error" do           
    delete :destroy, {:id => 9999}
    response.should redirect_to "/profile"
    flash[:error].should == I18n.t(:slideshow_was_not_deleted)
end

Here's the controller action in products_controller.rb:

def destroy
  product = Product.find_by_id(params[:id])
  redirect_to "profile" if !product
  if product.destroy
    flash[:notice] = t(:slideshow_was_deleted)
    if current_user.admin? and product.user != current_user
      redirect_to :products, :notice => t(:slideshow_was_deleted)
    else
      redirect_to "/profile"
    end
  else
    if current_user.admin?
      redirect_to :products, :error => t(:slideshow_was_not_deleted)
    else
      redirect_to "/profile"
    end
  end
end

Now, I didn't expect the spec to pass first time but I don't understand why it's failing with this:

Failure/Error: delete :destroy, {:id => 9999}
 ActiveRecord::RecordNotFound:
   Couldn't find Product with id=9999

I was under the impression that #find_by_id would not return RecordNotFound error on a non-existent record. So why am I getting one? Thanks in advance!


回答1:


The RecordNotFound error was being thrown by CanCan. It's not rescue-able from within the controller action (presumably it occurs before the action runs). There were two ways of resolving it -

  1. Changing the spec to:

    it "deleting a non-existent product should result in a RecordNotFound Error" do         
      product_id = 9999
      expect { delete :destroy, {:id => product_id}}.to raise_error ActiveRecord::RecordNotFound
    end
    

or, 2. Patching CanCan like this.

I didn't fancy the patching route, so I went for option 1.



来源:https://stackoverflow.com/questions/10189018/recordnotfound-raised-when-using-find-by-id-to-get-non-existent-record-in-rspec

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!