Как протестировать класс Django REST APIView с методами get и post, объединяющий несколько моделей?

В настоящее время я тестирую свой API для игры (модели и представления), и поскольку я никогда раньше не писал тесты, я получаю только ошибки для моих тестов.

Это мой GameView:

class GameView(APIView):
    """
    API View that retrieves the game,
    retrieves an game round as well as a random resource per round
    allows users to post tags that are verified and saved accordingly to either the Tag or Tagging table
    """

    def get(self, request, *args, **kwargs):
        current_score = 0
        if not isinstance(request.user, CustomUser):
            current_user_id = 1
        else:
            current_user_id = request.user.pk

        random_resource = Resource.objects.all().order_by('?').first()
        first_resource_serializer = ResourceSerializer(random_resource)

        gameround = Gameround.objects.create(user_id=current_user_id,
                                             gamesession=gamesession,
                                             created=datetime.now(),
                                             score=current_score)

        gameround_serializer = GameroundSerializer(gameround)

        return Response({  # 'gametype': gametype_serializer.data,
            'resource': resource_serializer.data,
            'gameround': gameround_serializer.data,
        })

    def post(self, request, *args, **kwargs):

        tag_serializer = TagSerializer(data=request.data)
        tagging_serializer = TaggingSerializer(data=request.data)

        if tagging_serializer.is_valid(raise_exception=True):
            tagging_serializer.save(tagging=request.data)
            return Response({"status": "success", "data": tagging_serializer.data}, status=status.HTTP_201_CREATED)
        else:
            return Response({"status": "error", "data": tag_serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

Вот что я уже попробовал в своем тестовом наборе:

class ARTigoGameViewTests(TestCase):

    def setUp(self):
        self.client = APIClient()
        self.artigo_game_data = {'resource': '',
                                 'gamesession': '',
                                 'gameround': ''}

        self.response = self.client.get('http://localhost:8000/artigo_api/artigo_game/',
                                        self.artigo_game_data,
                                        format="json")

    def test_api_can_create_game_data(self):
        """Test the api has resource retrieve capability."""
        self.client = APIClient()
        self.assertEqual(self.response.status_code, status.HTTP_200_OK)

    def test_get(self):
        response = self.client.get('http://localhost:8000/artigo_api/artigo_game/')
        self.assertEqual(response.status_code, 200)

    def test_post(self):
        self.client = APIClient()
        self.client.get('http://localhost:8000/artigo_api/artigo_game/')
        tag_data = {
            'id': 'New tag id',
            'name': 'New tag',
            'language': 'some language',
        }
        tagging_data = {
            'id': 'New tag id',
            'tag': tag_data,
            'gameround': 'New gameround',
            'created': 'date',
            'score': 'points',
            'resource': 'resource hash id',
        }

        response = self.client.post('http://localhost:8000/artigo_api/artigo_game/', data=tagging_data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

Поскольку оба моих запроса get и post объединяют разные модели, я не смог найти в сети хороший пример, как правильно протестировать это.

Что я делаю не так?

В частности, для этого представления я получаю ERROR:

ERROR frontend/tests/test_views.py::GameViewTests::test_api_can_create_game_data - TypeError: Field 'id' expected a number but got datetime.datetime(2022, 2, 6, 12, 2...
Вернуться на верх