Правильный способ проверить, есть ли у модели пользователя пароль - PullRequest
1 голос
/ 29 марта 2019

У меня есть эта модель

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" я получаю

=============================================== =======================

FAIL: test_user_password_cannot_be_empty (myapp.tests_user_testcase.UserTestCase) AssertionError: Исключение не вызвано create_user_without_password


Думаю, я проверяю это неправильно. Какой правильный путь?


Технические характеристики:

  • Python 3.6.1
  • Джанго 2.1.1
  • Windows 10

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Ваш код правильный, но password - это CharField, поэтому вы всегда можете создать пользователя без пароля таким образом (CharField по умолчанию всегда получает пустую строку, даже если blank=False) .

Вы также правильно звоните self.assertRaises, что требует вызываемого . Так что было бы неправильно делать self.assertRaises(Exception, create_user_without_password()), потому что это действительно вызовет исключение, потому что ваша функция будет вызываться дважды: исключение будет NoneType не вызывается. Ваш тест пройдет успешно, но не по правильной причине!

Модель Django по умолчанию AbstractBaseUser не требует установки password. Формы для создания пользователя делают это. Причина в том, что у вас может быть система, в которой пользователи сначала создаются другими пользователями без пароля, чтобы они могли сами установить пароль.

1 голос
/ 29 марта 2019

Вы, вероятно, сталкиваетесь с тем, что Django Models будет сохранять blank=False поля без ошибок.Вы можете найти длительные дебаты об этом.Чтобы применить его на уровне model.save, необходимо перезаписать метод сохранения.

def save(self, *args, **kwargs):
    self.full_clean()
    super().save(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...