我有这个模型
from django.db import models
from django.contrib.auth.models import AbstractUser
class Account(AbstractUser):
last_updated = models.DateTimeField(default=datetime.now, blank=False, null=False)
class User(Account):
security_question = models.TextField(blank=True)
security_answer = models.CharField(max_length=50, blank=True)
和这个简单的测试用例:
from django import test
from myapp import models
class UserTestCase(test.TestCase):
def test_user_password_cannot_be_empty(self):
def create_user_without_password():
models.User.objects.create(
username='usr2',
first_name='Name',
last_name='Name2',
email='me@email.com'
)
# should throw an error
self.assertRaises(
Exception,
create_user_without_password
)
该测试应该通过,因为密码是必填字段,但是通过运行python manage.py test --pattern="tests_*.py"
我得到
================================================ ======================
失败:test_user_password_cannot_be_empty(myapp.tests_user_testcase.UserTestCase) AssertionError:create_user_without_password未引发异常
我想我测试错了。正确的方法是什么?
规格:
答案 0 :(得分:1)
您可能已经遇到了Django模型将无错误地保存blank=False
字段的本质。您可以找到有关它的冗长辩论。要在model.save
级别实施它,您必须覆盖save方法。
def save(self, *args, **kwargs):
self.full_clean()
super().save(*args, **kwargs)
答案 1 :(得分:1)
您的代码正确,但是password
是CharField
,因此您始终可以通过这种方式创建没有密码的用户(CharField
始终默认设置为空字符串即使blank=False
)。
您还正确地调用了{em> callable 的self.assertRaises
。因此,执行self.assertRaises(Exception, create_user_without_password())
是错误的,因为这确实会引发异常,因为您的函数将被调用两次:异常为NoneType是不可调用的。您的测试会通过,但原因不正确!
默认Django模型AbstractBaseUser
不会强制设置password
。创建用户的表单可以执行此操作。原因是,您可能拥有一个系统,在该系统中,其他用户首先会创建没有密码的用户,以便他们可以自己设置密码。