如何使用rspec测试返回的异常?

时间:2019-07-17 08:17:27

标签: ruby-on-rails unit-testing rspec

  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,如果您对我发布的代码有一些提示,我会接受。

谢谢:)

1 个答案:

答案 0 :(得分:0)

似乎其他一些代码在执行Cart.find语句之前引发了异常。因此,ActiveRecord::RecordNotFound异常不会发生,并且rescue块也不会捕获。

基于引发的异常,看来您正在使用Pundit gem来处理授权。在您的show方法启动之前,此gem提供的授权规则肯定已在运行。可能是由于before_filter语句在此控制器或父控制器中发生的。

您将需要在应用程序中处理此类错误。在所有其他控制器都继承的基本控制器中使用rescue_form语句可能很方便,这样您就不必在每个控制器中都处理此类错误。