You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义UserModel单元测试出现NoneType AttributeError求助

解决Django自定义UserModel单元测试AttributeError问题

问题详情

自定义Django UserModel后执行单元测试,两次测试均失败,报错显示'NoneType' object has no attribute 'check_password'和'NoneType' object has no attribute 'email',说明调用create_user方法后得到的是None,而非预期的User实例。

报错信息

ERROR: test_create_user_with_email_successful (core.tests.test_models.ModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/app/core/tests/test_models.py", line 16, in test_create_user_with_email_successful
    self.assertTrue(user.check_password(password))
AttributeError: 'NoneType' object has no attribute 'check_password'

======================================================================
ERROR: test_new_user_email_normelaized (core.tests.test_models.ModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/app/core/tests/test_models.py", line 29, in test_new_user_email_normelaized
    self.assertEqual(user.email, expected)
AttributeError: 'NoneType' object has no attribute 'email'

----------------------------------------------------------------------
Ran 6 tests in 0.313s

FAILED (errors=2)

错误原因

问题出在自定义的UserManager类的create_user方法中:方法创建并保存了用户,但没有返回创建好的user对象,导致调用create_user时默认返回None,测试代码中用user变量接收None,访问其属性自然触发AttributeError。

修复方案

修改UserManager的create_user方法,在最后添加return user语句,确保方法返回创建的User实例。

修改后的模型代码:

from django.db import models
from django.contrib.auth.models import (
    AbstractBaseUser,
    BaseUserManager,
    PermissionsMixin
)


class UserManager(BaseUserManager):
    """manager for users"""
    def create_user(self, email, password=None, **extra_fields):
        """create save and return a new user"""
        user = self.model(email=self.normalize_email(email), **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        # 添加返回语句
        return user


class User(AbstractBaseUser, PermissionsMixin):
    """user in the system"""
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'

验证

修改后重新运行单元测试,create_user方法会返回正确的User实例,测试代码中的user变量不再是None,可以正常访问check_password方法和email属性,测试即可通过。

内容的提问来源于stack exchange,提问作者Motty Zeltzer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:48:27