Django 测试:“with self.assertRaises()...”和简单的“self.assertRaises”有什么区别

问题描述

能否请您帮助我了解 Django 测试(Python 3.7)中这两种语法之间的区别:

def test_updateItem_deletion(self):
   # some logic in here
    with self.assertRaises(OrderItem.DoesNotExist):
        OrderItem.objects.get(id=self.product_1.id)

还有:

  # all the same,but self.assertRaises not wrapped in 'with'
   self.assertRaises(OrderItem.DoesNotExist,OrderItem.objects.get(id=self.product_1.id))

一个工作并且测试通过。但是第二个提出:

models.OrderItem.DoesNotExist:OrderItem 匹配查询不存在。

它是否以某种方式复制了 try/catch 块的行为? 非常感谢!

解决方法

如果作为上下文管理器执行,第一个将捕获引发的异常。 在第二个中,没有什么可以捕获异常。

这称为上下文管理器。使用 with 语句时,会在 with 块的末尾调用 __exit__ 方法,其中包含块执行期间引发的任何异常。

直接调用assertRaises时不会调用这个__exit__方法,所以没有捕获异常。

您将在此处找到有关此的更多信息: