我想用另一个上下文管理器包装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()