2015-09-29 130 views
1

当我保存用户模型时,我想检查它是否有用户名。 因此,我写了这个pre_save异常测试失败

@receiver(pre_save, sender=User) 
def validate_user(sender, instance, **kwargs): 
    if len(instance.username) <= 5: raise Exception("Username too short") 

现在,在我的测试方法,我想测试此异常:

def test_user_no_username(self): 
    u = User.objects.create() 
    self.assertRaises(Exception, u.save()) 

测试失败。为什么?

回答

1

assertRaises是一种特定的异常 - 作为第二个参数你应该通过一个可调用的

assertRaises(exception, callable, *args, **kwds)

换句话说,不要叫u.save()

self.assertRaises(Exception, u.save) 

此外,你应该真的考虑有c ustom异常或使用内置的Django验证错误,而不是提高和捕捉广泛的Exception

+1

我会补充一点,因为我们不知道测试失败的位置,所以我认为它会失败,因为它会在'assertRaises'试图在'save'调用中捕获它之前在测试中引发异常。 User.objects.create()会将实例保存到数据库中,触发信号并抛出异常,但不会为了测试目的而捕获该异常。如果你想在保存它并抛出(预期的)错误之前实例化对象,使用'u = User()',然后试着用@alecxe说的assertRaises来捕获它。 – ryanmrubin

+0

它没有区别,仍然不起作用。 – Saphire

+0

@Saphire好吧,它是如何失败?谢谢。 – alecxe

相关问题