Как протестировать класс 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...