如何在Django中正确使用assertRaises

时间:2018-04-21 10:43:03

标签: django python-unittest django-testing django-tests django-errors

我的模型中有以下验证功能:

@classmethod
def validate_kind(cls, kind):
    if kind == 'test':
        raise ValidationError("Invalid question kind")

我试图测试如下:

w = Model.objects.get(id=1) 

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

我也尝试过:

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

这两项都不能正常工作。我做错了什么?

2 个答案:

答案 0 :(得分:3)

您调用assertRaises的方式是错误的 - 您需要pass a callable而不是调用函数本身,并将任何参数作为参数传递给assertRaises。将其更改为:

self.assertRaises(ValidationError, w.validate_kind, 'test')

请注意,您无法使用此结构测试异常消息 - 如果要测试消息,则需要使用assertRaises作为上下文管理器:

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

答案 1 :(得分:2)

接受的答案不正确。 self.assertRaises() 不检查异常消息。

正确答案

如果要断言异常消息,应使用 self.assertRaisesRegex()

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

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