测试异常代码时,使用self.assertRaises() as a context manager;这使您可以访问引发的异常,让您测试.code 属性:
with self.assertRaises(SystemExit) as cm:
arg_parse_obj.parse_known_args(['-h'])
self.assertEqual(cm.exception.code, 0)
要“抑制”或测试输出,您必须捕获sys.stdout 或sys.stderr,具体取决于argparse 输出(帮助文本转到stdout)。您可以为此使用上下文管理器:
from contextlib import contextmanager
from StringIO import StringIO
@contextmanager
def capture_sys_output():
capture_out, capture_err = StringIO(), StringIO()
current_out, current_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = capture_out, capture_err
yield capture_out, capture_err
finally:
sys.stdout, sys.stderr = current_out, current_err
并将它们用作:
with self.assertRaises(SystemExit) as cm:
with capture_sys_output() as (stdout, stderr):
arg_parse_obj.parse_known_args(['-h'])
self.assertEqual(cm.exception.code, 0)
self.assertEqual(stderr.getvalue(), '')
self.assertEqual(stdout.getvalue(), 'Some help value printed')
我在这里嵌套了上下文管理器,但是在 Python 2.7 和更高版本中,您也可以将它们组合成一行;不过,这往往会很快超过建议的 79 个字符限制。