测试用户模型是否具有密码的正确方法

时间:2019-03-29 16:15:31

标签: python django

我有这个模型

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未引发异常


我想我测试错了。正确的方法是什么?


规格:

  • Python 3.6.1
  • Django 2.1.1
  • Windows 10

2 个答案:

答案 0 :(得分:1)

您可能已经遇到了Django模型将无错误地保存blank=False字段的本质。您可以找到有关它的冗长辩论。要在model.save级别实施它,您必须覆盖save方法。

def save(self, *args, **kwargs):
    self.full_clean()
    super().save(*args, **kwargs)

答案 1 :(得分:1)

您的代码正确,但是passwordCharField,因此您始终可以通过这种方式创建没有密码的用户(CharField始终默认设置为空字符串即使blank=False)。

您还正确地调用了{em> callable 的self.assertRaises。因此,执行self.assertRaises(Exception, create_user_without_password())是错误的,因为这确实会引发异常,因为您的函数将被调用两次:异常为NoneType是不可调用的。您的测试会通过,但原因不正确!

默认Django模型AbstractBaseUser不会强制设置password。创建用户的表单可以执行此操作。原因是,您可能拥有一个系统,在该系统中,其他用户首先会创建没有密码的用户,以便他们可以自己设置密码。