我试图编写一个测试用例来检查代码是否在except
块内。
如果发生异常,我的方法foo()
不会抛出/提升它,它只会记录信息。
我曾尝试使用assertRaises但稍后我意识到这对我不起作用,因为我没有提出异常。
在Python文档中明确指出:
测试在使用任何也传递给assertRaises()的位置或关键字参数调用callable时引发异常。如果引发异常则测试通过,如果引发另一个异常则为错误,如果没有引发异常则失败。
所以,如果我有以下方法:
def foo():
try:
# Something that will cause an exception
except AttributeError:
log.msg("Shit happens")
是否可以编写一个测试用例来测试执行是否在except块内?
答案 0 :(得分:1)
你不能按照你想要的方式做到这一点。 Python会在整个地方引发和处理异常 - 例如,每个for
循环都会通过引发StopIteration
来退出。因此,断言某个地方存在异常,即使它已被处理,也几乎总是会过去。
可以做的是模仿记录器,如下所示:
_logs = []
def mocklog(str):
_logs.append(str)
mymodule.log = mocklog
mymodule.foo()
assertEqual(_logs, ['Shit happens'])
当然,在一个真实的项目中,你可能想要使用一个模拟库而不是像这样手工攻击它,但这应该证明这个想法。
答案 1 :(得分:-1)
你可以像这样使用assertRaises(https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises):
with self.assertRaises(Exception):
foo()
如果要测试日志记录,还有一个方法assertLogs。