问题描述
能否请您帮助我了解 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__方法,所以没有捕获异常。
您将在此处找到有关此的更多信息: