首页 > 解决方案 > 如何使用 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​​ on rails 的菜鸟,如果您对我发布的代码有一些提示,我会接受。

谢谢 :)

标签: ruby-on-railsunit-testingrspec

解决方案


Cart.find在执行您的语句之前,似乎其他一些代码正在引发异常。出于这个原因,ActiveRecord::RecordNotFound异常永远不会出现,也永远不会被rescue块捕获。

根据引发的异常,您似乎正在使用Pundit gem来处理授权。这个 gem 提供的授权规则肯定会在您的show方法开始之前运行。这可能是由于before_filter语句的结果,无论是在此控制器中还是在父控制器中。

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


推荐阅读