【问题标题】:Testing for exception fails异常测试失败
【发布时间】:2015-12-27 06:39:02
【问题描述】:

当我保存用户模型时,我想检查它是否有用户名。 所以我写了这个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())

测试失败。为什么?

【问题讨论】:

    标签: python django unit-testing testing django-testing


    【解决方案1】:

    assertRaises 是一种特定的异常 - 作为第二个参数,您应该传递一个可调用对象

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

    也就是说,不要打电话给u.save()

    self.assertRaises(Exception, u.save)
    

    此外,您应该真正考虑使用自定义异常或使用内置的 Django 验证错误,而不是引发和捕获广泛的 Exception

    【讨论】:

    • 我要补充一点,因为我们不知道测试在哪里失败,我认为它失败了,因为它会在 assertRaises 试图在 @987654328 中捕获它之前在测试中引发异常@ 称呼。 User.objects.create() 会将实例保存到数据库中,触发信号并抛出异常,但不会出于测试目的捕获它。如果您想在保存对象并引发(预期的)错误之前实例化对象,请使用u = User(),然后尝试使用@alecxe 所说的assertRaises 来捕获它。
    • @Saphire 好的,它是怎么失败的?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 2012-12-10
    • 1970-01-01
    • 2015-12-07
    • 2012-10-23
    • 2013-08-12
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多