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__方法,所以没有捕获异常
在这里您可以找到更多相关信息:
能否请您帮助我理解 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__方法,所以没有捕获异常
在这里您可以找到更多相关信息: