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
相关产品推荐
相关产品推荐

