如何在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
相关产品推荐
相关产品推荐

