Как я могу правильно протестировать swagger_auto_schema для методов, request_body и ответов в drf-задаче с помощью pytest?
Я работаю над тестированием Django REST Framework (DRF) CartViewSet с использованием pytest, и мне нужно проверить свойства swagger_auto_schema, такие как HTTP-метод, тело запроса и ответы на различные действия (например, добавление, удаление, очистка).
У меня есть следующий код в моем CartViewSet:
class CartViewSet(GenericViewSet, RetrieveModelMixin, ListModelMixin):
# Other viewset code...
@swagger_auto_schema(
method="post",
request_body=AddToCartSerializer,
responses={
201: openapi.Response(description="Item added successfully."),
400: openapi.Response(description="Invalid input data"),
},
)
@action(detail=False, methods=["post"], url_path="add")
def add(self, request):
# Logic for adding an item to the cart
pass
Теперь я хочу написать модульный тест pytest, чтобы проверить следующее для метода add:
- HTTP-метод: Убедитесь, что метод
swagger_auto_schema
являетсяPOST
. - Текст запроса: Убедитесь, что для текста запроса установлен правильный сериализатор (
AddToCartSerializer
). - Ответы: Убедитесь, что коды состояния ответов (
201
и400
) и их описания заданы правильно.
Не мог бы кто-нибудь подсказать мне, как правильно протестировать свойства swagger_auto_schema для метода, тела запроса и ответов в pytest?
Мы были бы очень признательны за любую помощь или разъяснения!
Если вы следовали краткому руководству по началу работы, чтобы добавить drf-yasg в свой проект, вы добавили конечную точку, которая возвращает всю схему в формате json.
Это выглядит так:
path('swagger<format>/', schema_view.without_ui(cache_timeout=0), name='schema-json'),
Если вы вызываете конечную точку локально, вы можете получить полезную нагрузку со всем, что отображается в пользовательском интерфейсе swagger.
В полезной нагрузке есть поле пути, которое содержит список существующих конечных точек, под которым у вас есть http-методы для каждого из них, а также возможные коды ответов.
В другом поле компоненты вы можете найти список имен сериализаторов.
Теперь, учитывая все это, вы можете вызывать конечную точку в своих тестах и утверждать части текста ответа, подтверждающие изменения в пользовательском интерфейсе swagger.
Это можно протестировать следующим образом.
def test_cart_viewset_add_swagger_documentation(self):
"""Test that the CartViewSet's add method has proper Swagger documentation."""
# Get the add method from CartViewSet
add_method = CartViewSet.add
# Access the swagger schema from the method
schema_info = getattr(add_method, "_swagger_auto_schema", {})
# The structure has 'post' as the key since it's a POST method
method_info = schema_info.get("post", {})
# Verify request body is defined
request_body = method_info.get("request_body", None)
assert request_body == AddToCartSerializer
# Verify responses are defined
responses = method_info.get("responses", {})
assert 201 in responses
assert 400 in responses
# Verify response content
success_response = responses.get(201)
assert isinstance(success_response, openapi.Response)
assert success_response.description == "Item added successfully."
error_response = responses.get(400)
assert isinstance(error_response, openapi.Response)
assert error_response.description == "Invalid input data"