微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AttributeError: 'CustomUser' 对象没有属性 'items' - 单元测试阶段

如何解决AttributeError: 'CustomUser' 对象没有属性 'items' - 单元测试阶段

我正在做一个图书项目。对于这个项目,我已经创建了一个自定义用户模型并使用它。然而,今天我试图测试这个模型。当我想运行此代码时,它返回 AttributeError: 'CustomUser' object has no attribute 'items' 响应。

我不明白我哪里做错了。如果我以字典类型发送数据,测试有效,但如果我想以实例类型发送,它会返回错误

追溯

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: test_user_registration (account.tests.custom_user_tests.CustomUserRegistrationTests)
User registration with correct values
----------------------------------------------------------------------
Traceback (most recent call last):
  File "E:\!Staj\bookorbooks\bookorbooks\account\tests\custom_user_tests.py",line 35,in test_user_registration
    response = self.client.post(self.url,self.user1)
  File "E:\!Staj\bookorbooks\env\lib\site-packages\rest_framework\test.py",line 295,in post
    response = super().post(
  File "E:\!Staj\bookorbooks\env\lib\site-packages\rest_framework\test.py",line 208,in post
    data,content_type = self._encode_data(data,format,content_type)
  File "E:\!Staj\bookorbooks\env\lib\site-packages\rest_framework\test.py",line 179,in _encode_data
    ret = renderer.render(data)
  File "E:\!Staj\bookorbooks\env\lib\site-packages\rest_framework\renderers.py",line 914,in render
    return encode_multipart(self.BOUNDARY,data)
  File "E:\!Staj\bookorbooks\env\lib\site-packages\django\test\client.py",line 245,in encode_multipart
    for (key,value) in data.items():
AttributeError: 'CustomUser' object has no attribute 'items'

----------------------------------------------------------------------
Ran 1 test in 0.159s

Failed (errors=1)
Destroying test database for alias 'default'...

自定义用户模型

class CustomUser(AbstractUser):
    GENDER_CHOICES = (
        (1,AccountStrings.CustomUserStrings.gender_choice_male),(2,AccountStrings.CustomUserStrings.gender_choice_female),(3,AccountStrings.CustomUserStrings.gender_choice_other),)

    USER_TYPE_CHOICES = (
        (1,AccountStrings.CustomUserStrings.user_type_choice_default),AccountStrings.CustomUserStrings.user_type_choice_child),AccountStrings.CustomUserStrings.user_type_choice_parent),(4,AccountStrings.CustomUserStrings.user_type_choice_instructor),)
    objects = CustomUserManager()
    email = models.EmailField(max_length=255,unique=True,null=False,blank=False)
    identity_number = models.CharField(
        max_length=11,verbose_name=AccountStrings.CustomUserStrings.
        identity_number_verbose_name)
    birth_date = models.DateField(
        null=True,blank=True,verbose_name=AccountStrings.CustomUserStrings.birth_date_verbose_name)
    gender = models.PositiveSmallIntegerField(
        choices=GENDER_CHOICES,default=1,verbose_name=AccountStrings.CustomUserStrings.gender_verbose_name)
    user_type = models.PositiveSmallIntegerField(
        choices=USER_TYPE_CHOICES,verbose_name=AccountStrings.CustomUserStrings.user_type_verbose_name)

    class Meta:
        verbose_name = AccountStrings.CustomUserStrings.Meta_verbose_name
        verbose_name_plural = AccountStrings.CustomUserStrings.Meta_verbose_name_plural

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

单元测试

from rest_framework.test import APITestCase
from django.urls import reverse
from django.contrib.auth import get_user_model

User = get_user_model()


class CustomUserRegistrationTests(APITestCase):
    url = reverse("account:register")

    def setUp(self) -> None:
        self.user1 = User.objects.create_user(first_name="John",last_name="Doe",email="johndoe@example.com",username="demo",password="Pas12wor21d",identity_number = "12345678910",user_type = "2",gender = 1)

    def test_user_instance(self):
        """
            Check the user instance was created successfully
        """

        self.assertisinstance(self.user1,User)

    def test_user_registration(self):
        """
            User registration with correct values
        """

        data = {
            "username" : "johndoe","email": "johndoe@example.com","password": "johndoe123","identity_number": "12345678911","user_type": 2,"gender": 1,"first_name": "John","last_name": "Doe","birth_date": "2000-07-26"
        }

        response = self.client.post(self.url,self.user1)
        # response = self.client.post(self.url,data)
        self.assertEqual(201,response.status_code)

解决方法

在您的 test_user_registration 测试中,您需要将 data 作为 POST 请求的第二个参数传递,因此:

#                      not self.user1  ↓
response = self.client.post(self.url,data)

通过使用 self.user1,您使用了一个 CustomUser 对象,由于它不是类似字典的对象,因此会引发错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。