如何使用Python unittest库断言异常?测试报NoneType不可调用是什么原因
代码问题排查及修复
你给出的代码存在两处核心错误,以下是具体说明和修复方案:
1. 自定义函数fun的缩进与逻辑错误
你给出的fun代码中except关键字缩进错误,和try块内的return 1同级,属于无效语法,会直接触发语法错误。同时当前except块直接pass会吞噬所有抛出的异常,导致你预期的ValueError无法被单元测试捕获,函数异常分支会直接返回None。
修复后的fun代码(保留异常抛出逻辑供测试):
def fun(n): try: if n < 1: raise ValueError return 1 except: # 若需要测试异常抛出,此处不要吞噬异常,可直接重抛或者删除try-except包裹 raise
如果你的业务逻辑确实需要捕获异常不抛出,需要调整单元测试的判断逻辑,改为判断异常分支返回值符合预期即可。
2. 单元测试assertRaises调用方法错误
unittest的assertRaises方法预期接收的是可调用对象和对应的参数,而不是直接执行函数后的返回值。你写的self.assertRaises(ValueError, fun(-1))会先执行fun(-1),拿到返回值(当前逻辑下为None)传入方法,assertRaises尝试调用这个None对象就会触发你遇到的TypeError: 'NoneType' object is not callable报错。
两种正确写法:
- 写法1:直接传入可调用对象和参数
self.assertRaises(ValueError, fun, -1)
- 写法2:使用上下文管理器包裹调用语句(可读性更高)
with self.assertRaises(ValueError): fun(-1)
修复后的完整测试代码:
import unittest class TestFibonnacci(unittest.TestCase): def test_values(self): self.assertEqual(fun(1),1) # 修改为正确的assertRaises调用方式 with self.assertRaises(ValueError): fun(-1) if __name__ == '__main__': unittest.main()
内容的提问来源于stack exchange,提问作者Tommy do Nascimiento
相关产品推荐
相关产品推荐

