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

如何在Django中正确使用assertRaises?我的测试代码为何失效?

哦,我知道你哪里错了!

你现在的写法犯了一个测试新手常踩的坑——你直接执行了验证函数,而不是让测试框架帮你去执行并捕获异常。

举个例子,你写的self.assertRaises(ValidationError, w.validate_kind('test'), ...)里,w.validate_kind('test')会在assertRaises方法运行之前就被调用,这时候异常直接抛出来,测试框架根本没机会去检测它,自然就失败了。

给你两种正确的写法:

1. 拆分函数与参数传递

把函数本身和它的参数分别传给assertRaises,不要直接调用:

self.assertRaises(ValidationError, w.validate_kind, 'test', msg='Invalid question kind')

这样测试框架会帮你调用w.validate_kind('test'),并检查是否抛出了预期的ValidationError。

2. 用上下文管理器(更推荐,可读性拉满)

用with语句把要执行的代码包起来,逻辑更清晰:

with self.assertRaises(ValidationError) as ctx:
    w.validate_kind('test')

# 如果还要验证错误消息是否匹配,可以加这句
self.assertEqual(str(ctx.exception), 'Invalid question kind')

至于你试的assertRaisesRegex,参数顺序错啦!

正确的顺序应该是:先传异常类型,再传匹配的正则表达式,最后是函数和参数:

self.assertRaisesRegex(ValidationError, r'Invalid question kind', w.validate_kind, 'test')

或者同样用上下文管理器的写法:

with self.assertRaisesRegex(ValidationError, r'Invalid question kind'):
    w.validate_kind('test')

核心要点就是:别在断言方法里直接执行函数,要么把函数和参数分开传,要么用上下文管理器包裹执行代码。

内容的提问来源于stack exchange,提问作者Beliaf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:34:26