def show
begin
@cart = Cart.find(params[:id])
authorize(@cart)
@cart_entries = CartEntry.where(:cart_id => @cart.id)
@products = {}
@pr_references = {}
@cart_entries.each do |cart_entry|
@pr_references[cart_entry.id] = Reference.find(cart_entry.reference_id)
@products[cart_entry.id] = Product.find(@pr_references[cart_entry.id].product_id)
end
rescue ActiveRecord::RecordNotFound => e
respond_to do |format|
format.json {render json: {'error': e}, status: :not_found}
end
end
我想测试Cart.find()找不到购物车,并且我想测试该方法返回带有以下测试的404 HTTP代码。
it 'don\'t find cart, should return 404 error status' do
delete :destroy, params: {id: 123, format: 'json'}
expect(response).to have_http_status(404)
end
您是否有指示或解决方案? 我是一个在Ruby上使用Ruby的nooby,如果您对我发布的代码有一些提示,我会接受。
谢谢:)
答案 0 :(得分:0)
似乎其他一些代码在执行Cart.find
语句之前引发了异常。因此,ActiveRecord::RecordNotFound
异常不会发生,并且rescue
块也不会捕获。
基于引发的异常,看来您正在使用Pundit gem来处理授权。在您的show
方法启动之前,此gem提供的授权规则肯定已在运行。可能是由于before_filter语句在此控制器或父控制器中发生的。
您将需要在应用程序中处理此类错误。在所有其他控制器都继承的基本控制器中使用rescue_form语句可能很方便,这样您就不必在每个控制器中都处理此类错误。