2015-09-29 129 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

相關問題