Получение ошибок при выполнении автоматизированного тестирования для моего DRF APi

Я выполняю несколько автоматизированных тестов на APIViews (конечные точки API) с DRF для моего Django проекта.

Проблема, с которой я столкнулся, заключается в том, что я не могу успешно запустить тесты с python manage.py test.

Я уверен, что правильно настроил все для моих APIViews/тестов в соответствии с документацией DRF, однако я получаю ошибку трассировки, предполагающую, что что-то может быть не так с моим response = self.client.post(url, data, format='json') в моем UserRegisterTests

from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from ..models import User

class UserRegisterTests(APITestCase):
    def test_register_user(self):
        
        url = reverse('register')
        data = {'email': 'myemail@mail.com', 'password': 'mypassword123'}
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(User.objects.count(), 1)
        self.assertEqual(User.objects.post().email, 'myemail@mail.com')
        self.assertTrue(User.objects.check_password('mypassword1123'))

И, возможно, что-то не так с if serializer.is_valid(): в моем регистре APIView (views)

# API endpoint for registration
@authentication_classes([JWTAuthentication])
class RegisterView(APIView):
  def post(self, request):
    serializer = RegisterSerializer(data=request.data, context={'request': request})
    if serializer.is_valid():
      serializer.save()
       
      return Response({
        'message': 'successfully registered',  
      }, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Это может быть полезно, вот мой RegisterSerializer

class RegisterSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'}, write_only=True)

    class Meta:
        model = User
        fields = ['email', 'password', 'password2']

    def validate(self, valid):
        if valid['password'] != valid['password2']:
            raise serializers.ValidationError({"password": "Passwords do not match."})
        return valid

    def create(self, validated_data):
        user = User.objects.register_user(
            email=validated_data['email'],
            pasword=validated_data['password']
        )
        return user

Вот моя ошибка трассировки

Пожалуйста, помогите мне, я хочу знать, почему мои автоматизированные тесты не работают должным образом.

Вы неправильно поняли ответ по первой ссылке, в этом ответе в качестве решения предлагается заменить модель в классе Meta, как в коде ниже. Также убедитесь, что вы установили AUTH_USER_MODEL='custom_user_app.CustomUserModel' в файле настроек.

# You need to replace the direct import of your model with the one shown below
# from .models import User

from django.contrib.auth import get_user_model

User = get_user_model()


class RegisterSerializer(serializers.ModelSerializer):
    password = serializers.CharField(
        style={'input_type': 'password'},
        write_only=True,
    )

    class Meta:
        model = User
        fields = ['email', 'password', 'password2']

    ...

Также попробуйте проделать тот же трюк в своих тестах. Это должно исправить вашу первоначальную ошибку, но в вашем коде все еще есть проблемы, например, в методе сериализатора create замените ключевое слово pasword на password. Надеюсь, теперь вам стало понятнее, что нужно делать, теперь вы должны проверить это сами и сообщить мне, исправлена ли ваша проблема?

Вернуться на верх