ruby-on-rails - 如何使用 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 的菜鸟,如果您对我发布的代码有一些提示,我会接受。
谢谢 :)
解决方案
Cart.find
在执行您的语句之前,似乎其他一些代码正在引发异常。出于这个原因,ActiveRecord::RecordNotFound
异常永远不会出现,也永远不会被rescue
块捕获。
根据引发的异常,您似乎正在使用Pundit gem来处理授权。这个 gem 提供的授权规则肯定会在您的show
方法开始之前运行。这可能是由于before_filter语句的结果,无论是在此控制器中还是在父控制器中。
您将需要在应用程序中处理此类错误。在所有其他控制器继承的基本控制器中使用rescue_form语句可能很方便,这样您就不必在每个控制器中处理这种错误。
推荐阅读
- android - 对于 Google Places API,缓存的“合理使用”案例有哪些?
- r - 有没有更好的方法来使用 R 的“quantmod”检索准确的每周和每月股票价格数据?
- android - 即使在 Flutter 中使用正确的 SHA1 密钥,Google 地图也无法在发布版本中工作
- arm - ARM 中 TPIDR_EL0/TPIDR_EL1 等线程 ID 寄存器的用途是什么?
- javascript - Angular 管道上的 .includes 正在返回 '属性'includes' 在类型 'never'.ts(2339) 上不存在' 错误消息
- node.js - 喜欢彼此的用户如何使用 sequelize postgres nodejs 发帖?
- c# - .net 核心集成测试解析范围服务
- spring-boot - 在应用程序加载时创建 bean
- javascript - React 中的动态类名操作
- python - AttributeError:'numpy.datetime64'对象在python 3 CLoudera中没有属性'toordinal'