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

问题描述 投票:0回答:2

我试图写一个测试用例,检查代码是否进入except块。

我的方法foo()在异常的情况下不会抛出/提升它,它只是记录信息。

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

在Python文档中,显然可以说:

测试在使用任何也传递给assertRaises()的位置或关键字参数调用callable时引发异常。如果引发异常则测试通过,如果引发另一个异常则为错误,如果没有引发异常则失败。

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

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

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

python python-2.7 python-unittest assertions
2个回答
1
投票

你不能按照你想要的方式做到这一点。 Python在整个地方引发和处理异常 - 例如,每个单独的for循环通过提升和处理StopIteration而退出。因此,断言某个地方存在异常,即使它已被处理,也几乎总是会通过。

你能做的就是模仿记录器,如下所示:

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

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

当然,在一个真实的项目中,你可能想要使用一个模拟库而不是像这样手工攻击它,但这应该证明这个想法。


-1
投票

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

with self.assertRaises(Exception):
     foo()

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

© www.soinside.com 2019 - 2024. All rights reserved.