如何使用 Python 中的 unittest 检查代码是否进入 except 块内部

How to check if code goes inside of except block using unittest in Python

我一直在尝试编写一个测试用例来检查代码是否在 except 块内。

我的方法 foo() 在发生异常时不会 throw/raise 它,它只是记录信息。

我曾尝试使用 assertRaises 但后来我意识到这对我不起作用,因为我没有引发异常。

在 Python 文档中明确指出:

Test that an exception is raised when callable is called with any positional or keyword arguments that are also passed to assertRaises(). The test passes if exception is raised, is an error if another exception is raised, or fails if no exception is raised.

所以,如果我有以下方法:

def foo():
    try:
        # Something that will cause an exception
    except AttributeError:
        log.msg("Shit happens")

是否可以编写一个测试用例来测试执行是否进入 except 块内部?

您可以像这样使用 assertRaises (https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises):

with self.assertRaises(Exception):
     foo()

如果你想测试日志记录,还有一个方法 assertLogs。

你不能按照你想要的方式来做这件事。 Python 在所有地方引发和处理异常——例如,每个 for 循环通过引发和处理 StopIteration 退出。因此,断言某处存在异常,即使它已被处理,也几乎总是会通过。

可以做的是模拟记录器,像这样:

_logs = []
def mocklog(str):
    _logs.append(str)

mymodule.log = mocklog
mymodule.foo()
assertEqual(_logs, ['Shit happens'])

当然,在 real-life 项目中,您可能希望使用模拟库而不是像这样手动修改它,但这应该可以证明这个想法。