Django Rest Framework - тестирование сериализаторов против тестирования представлений

Я пишу новое Django-приложение с Django Rest Framework и пытаюсь использовать TDD настолько, насколько это возможно, но я немного не уверен, где провести границу между тестированием сериализатора и тестированием представления.

Позвольте мне привести пример.

Если у меня есть следующий сериализатор:-

class EventMembershipSerializer(serializers.ModelSerializer):
    select = serializers.BooleanField(required=False)

    class Meta:
        fields = ['event']

    def validate(self, attrs):
        if not attrs["event"].started:
            if "is_selected" in attrs:
                raise serializers.ValidationError(
                    {"select": "Cannot set selected for event in the future."}
                )
        
        return super().validate(attrs)

и следующий вид:-

class EventMembershipViewSet(viewsets.GenericViewSet):
    queryset = Event.objects.all()
    serializer_class = EventSerializer

тогда я могу написать это, чтобы проверить сериализатор:-

def test_create_select(
        self,
        past_event_factory,
    ):
        event = past_event_factory()

        data = {
            "event": event.hashid,
            "select": True
        }

        with pytest.raises(
            ValidationError, match="Cannot set selected for event in the future."
        ):
            serializer = EventMembershipSerializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()

и вот это для проверки вида:-

def test_create(
        self,
        past_event_factory,
        api_client
    ):
        url = reverse(<url>)

        event = past_event_factory()

        data = {
            "event": event.hashid,
            "select": True,
        }

        response = api_client.post(url, data, format="json")
        assert response.status_code == status.HTTP_400_BAD_REQUEST

        assert response.data["non_field_errors"][0] == "Cannot set selected for event in the future."

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

Так должен ли мой тест представления просто проверять, что представление использует этот сериализатор? Или можно дублировать тестовые данные и результаты? Где я должен провести черту?

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