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

Django tests: what is the difference between "with self.assertRaises()..." and simply "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 matching query does not exist.

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

如果作为上下文管理器执行,第一个将捕获引发的异常。 在第二个上,没有任何东西捕获异常。

这称为 ContextManager。使用 with 语句时,在 with 块的末尾调用 __exit__ 方法,包含在块执行期间引发的任何异常。

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

在这里您可以找到更多相关信息: