Как использовать наборы представлений и сериализаторы в pytest==7.0.1 Параметризация в тестировании djangorestframework==3.13.1 get_serializer() и get_permission()?

Я использую шаблон проекта Django из здесь. Я тестирую свои сериализаторы и разрешения в каждом viewset, который есть в моем приложении. Я хочу использовать параметризацию из pytest, чтобы сократить количество строк, необходимых для написания тестов для каждого сериализатора и набора представлений. У меня есть 10 сериализаторов и наборов представлений, которые мне нужно протестировать и которые имеют шаблон, как показано ниже

test_drf_viewsets.py

    @pytest.mark.parametrize(
        ("app_url", "app_viewset", "serializer"),
        [
            (
                "api:mv-signup-list",
                viewset.UserSignUpMaterializedViewSet,
                serializers.UserSignUpMaterializedViewSerializer,
            ),
            (
                "api:mv-total-list",
                viewset.TotalMaterializedViewSet,
                serializers.TotalMaterializedViewSerializer,
            ),
        ],
    )
    def test_get_serializer(
        self,
        admin_user: User,
        app_url: str,
        app_viewset,
        serializer,
        rf: RequestFactory,
    ):
       
        viewsets = app_viewset

        request = rf.get(reverse(app_url))
        request.user = admin_user

        viewsets.request = Request(request)
        viewsets.format_kwarg = None

        assert isinstance(viewsets.get_serializer(), serializer)

Однако, когда я запускаю приведенный выше код, он показывает эту ошибку

TypeError: GenericAPIView.get_serializer() missing 1 required positional argument: 'self'
  • Представленный выше код опущен для краткости.

Я нашел минимальное решение, которое работает для моего случая использования.

Вместо этого используйте следующие:

assert isinstance(viewsets.get_serializer(), serializer)

Измените его на следующее:

assert viewsets.serializer_class == serializer

То же самое с get_permission:

assert viewsets.permission_classes[0] == IsAuthenticated

Код выше работает, когда они изменены.

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