如何将 unittest 的断言提升包装在另一个上下文管理器中?



我想用另一个上下文管理器包装unittest.TestCase().assertRaises上下文管理器,但很难找到解决方案。以下是我的方法:

import unittest
from contextlib import contextmanager

@contextmanager
def wrapper():
print("Before assertion")
yield unittest.TestCase().assertRaises(ValueError)
print("After assertion")

with wrapper():
raise ValueError()

然而,ValueError不会被assertRaises捕获,并且运行代码的输出是:

Before assertion
Traceback (most recent call last):
File "test.py", line 13, in <module>
raise ValueError()
ValueError

我如何将assertRaises包装在另一个上下文管理器中,以便它捕获预期的异常,但让我有机会在之后做一些事情("After assertion";会被打印出来)?我可以做下面的事情来捕获assertRaises未捕获的错误吗?

@contextmanager
def wrapper():
try:
print("Before assertion")
yield unittest.TestCase().assertRaises(ValueError)
print("After assertion")
except Exception:
print("Did not raise ValueError!")

您的上下文管理器产生另一个上下文管理器,因此您需要另一个with:

import unittest
from contextlib import contextmanager

@contextmanager
def wrapper():
print("Before assertion")
yield unittest.TestCase().assertRaises(ValueError)
print("After assertion")

with wrapper() as another_manager:
with another_manager:
raise ValueError()

您可能想要做的不是生成上下文管理器,而是将assertRaises上下文放入包装器中,并从其中生成(None):

import unittest
from contextlib import contextmanager

@contextmanager
def wrapper():
print("Before assertion")
with unittest.TestCase().assertRaises(ValueError):
yield
print("After assertion")

with wrapper():
raise ValueError()