首页 > 解决方案 > Django 测试登录

问题描述

我为创建用户和登录创建了一个测试。在我的设置中,我使用 min_length = 8 定义了密码。但是测试通过了 3 个字符的密码。这是我的设置:

AUTH_PASSWORD_VALIDATORS = [
    {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', },
    {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {'min_length': 8}},
    {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
    {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', },]

我的测试如下所示:

from django.test import TestCase
from django.contrib.auth import get_user_model


class UsersManagersTests(TestCase):

def test_create_user(self):
    custom_user = get_user_model()
    user = custom_user.objects.create_user(email='normal@user.com', password='foo')
    self.assertEqual(user.email, 'normal@user.com')
    self.assertTrue(user.is_active)
    self.assertFalse(user.is_staff)
    self.assertFalse(user.is_superuser)
    try:
        # username is None for the AbstractUser option
        # username does not exist for the AbstractBaseUser option
        self.assertEqual(user.username, '')
        # password will be encrypted with bcrypt
        self.assertNotEqual(user.password, 'foo')
    except AttributeError:
        pass
    with self.assertRaises(TypeError):
        custom_user.objects.create_user()
    with self.assertRaises(TypeError):
        custom_user.objects.create_user(username='')
    with self.assertRaises(TypeError):
        custom_user.objects.create_user(username='', password="foo")

def test_create_superuser(self):
    custom_user = get_user_model()
    admin_user = custom_user.objects.create_superuser(email='super@user.com', password='bla')
    self.assertEqual(admin_user.email, 'super@user.com')
    self.assertTrue(admin_user.is_active)
    self.assertTrue(admin_user.is_staff)
    self.assertTrue(admin_user.is_superuser)
    try:
        # username is None for the AbstractUser option
        # username does not exist for the AbstractBaseUser option
        self.assertEqual(admin_user.username, '')
    except AttributeError:
        pass
    with self.assertRaises(ValueError):
        custom_user.objects.create_superuser(
            email='super@user.com', password='bla', is_superuser=False)

def test_login_user(self):
    # Create an instance of a POST request.
    self.client.login(email="normal@user.com", password="foo")
    data = {'username': 'test name'}
    res = self.client.post('/accounts/login/', data)
    self.assertEqual(res.status_code, 200)

我错过了什么?还是在测试期间没有考虑这些设置?

标签: djangodjango-tests

解决方案


这是预期和记录的行为

默认情况下,验证器用于重置或更改密码的表单createsuperuser以及changepassword管理命令中。验证器不在模型级别应用,例如在User.objects.create_user()和中create_superuser(),因为我们假设开发人员而不是用户在该级别与 Django 进行交互,而且模型验证不会作为创建模型的一部分自动运行。


推荐阅读