You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:48:03