AttributeError: 'CustomUser' object has no attribute 'items' - Unit Test Phase

AttributeError: 'CustomUser' object has no attribute 'items' - Unit Test Phase

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

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

回溯

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),
        (2, AccountStrings.CustomUserStrings.user_type_choice_child),
        (3, 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,
        unique=True,
        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,
        default=1,
        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 测试中,您需要将 数据 作为 POST 请求的第二个参数传递,因此:

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

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