Ошибка теста проекта api_yatube

Рейтинг: 0Ответов: 1Опубликовано: 10.05.2023

AssertionError: Проверьте, что POST-запрос с корректными данными от авторизованного пользователя к /api/v1/posts/{post.id}/comments/ возвращает ответ со статусом 201

urls.py:

from django.urls import include, path
from rest_framework import routers
from rest_framework.authtoken import views

from .views import CommentViewSet, GroupViewSet, PostViewSet, UserViewSet

app_name = "posts"

router = routers.DefaultRouter()
router.register(r"posts", PostViewSet, basename="posts")
router.register(r"groups", GroupViewSet, basename="groups")
router.register(r"users", UserViewSet, basename="users")
router.register(
    r"posts/(?P<post_id>[^/.]+)/comments", CommentViewSet, basename="comments"
)

urlpatterns = [
    path("v1/", include(router.urls)),
    path("v1/api-token-auth/", views.obtain_auth_token, name="auth_token"),
]

views.py:

from django.shortcuts import get_object_or_404
from rest_framework import status, viewsets
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from posts.models import Comment, Group, Post, User
from .permissions import OwnerOrReadOnly
from .serializers import (
    CommentSerializer,
    GroupSerializer,
    PostSerializer,
    UserSerializer,
)


class GroupViewSet(viewsets.ModelViewSet):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

    def create(self, request, *args, **kwargs):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

    def destroy(self, request, *args, **kwargs):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

    def update(self, request, *args, **kwargs):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = (OwnerOrReadOnly, IsAuthenticated)

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class CommentViewSet(viewsets.ModelViewSet):
    serializer_class = CommentSerializer
    permission_classes = (OwnerOrReadOnly, IsAuthenticated)

    def get_queryset(self):
        post = get_object_or_404(Post, pk=self.kwargs.get("post_id"))
        return Comment.objects.filter(post=post)

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

serializers.py

from rest_framework import serializers

from posts.models import Comment, Group, Post, User


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = (
            "id",
            "username",
            "first_name",
            "last_name",
        )
        ref_name = "ReadOnlyUsers"


class CommentSerializer(serializers.ModelSerializer):
    author = serializers.SlugRelatedField(
        slug_field="username", read_only=True
    )

    class Meta:
        model = Comment
        fields = ("id", "author", "post", "text", "created")
        read_only_fields = ("author", "post")


class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = "__all__"


class PostSerializer(serializers.ModelSerializer):
    author = serializers.SlugRelatedField(
        slug_field="username", read_only=True
    )

    class Meta:
        model = Post
        fields = ("id", "text", "pub_date", "author", "image", "group")

Ответы

▲ 0

Возможная причина ошибки AssertionError заключается в том, что POST-запрос к /api/v1/posts/{post.id}/comments/ возвращает ответ с неправильным статусом, а не ожидаемым 201.

Чтобы решить проблему, вам следует выполнить следующие шаги:

Убедитесь, что ваш клиентский код правильно выполняет POST-запрос к /api/v1/posts/{post.id}/comments/ с корректными данными и авторизацией.

Проверьте вашу реализацию метода perform_create в CommentViewSet из views.py. Убедитесь, что вы правильно сохраняете автора комментария и возвращаете ответ с корректным статусом. Примерно так:

python

def perform_create(self, serializer):
    serializer.save(author=self.request.user)
    return Response(serializer.data, status=status.HTTP_201_CREATED)

Проверьте, что у вас правильно настроены разрешения в классе CommentViewSet. Убедитесь, что вы используете IsAuthenticated для требования авторизации пользователя.

Если после выполнения этих шагов ошибка AssertionError все еще возникает, вам может потребоваться провести дополнительную отладку и проверить логи сервера или использовать инструменты для тестирования API, такие как Postman или curl, чтобы убедиться, что ваш API возвращает ожидаемый ответ.