Выполнение модульного тестирования в Django
Я выполняю модульный тест в Django, но постоянно получаю ошибку
File "C:\****\views.py", line 21, in post
s = str(points['string_points'])
KeyError: 'string_points'
Используемая команда:
python manage.py test
Структура моего тестового кода выглядит следующим образом:
class TestSetUp(APITestCase):
def setUp(self):
self.getClosestDistance_url = reverse('getClosestDistance')
self.calculateClosestDistance_url = reverse('calcClosestDistance')
points = {
"string_points": "(2,3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)"
}
return super().setUp()
def tearDown(self):
return super().tearDown()
class TestViews(TestSetUp):
def test_getClosestPoints_with_no_data(self):
res = self.client.post(self.calculateClosestDistance_url)
import pdb # python debugger
pdb.set_trace()
self.assertEqual(res.status_code, 400)
Структура моего файла views.py следующая:
class closestDistanceValue(APIView):
def get(self, request):
points = Points.objects.all()
serializer = PointsSerializer(points, many=True)
return Response(serializer.data)
def post(self, request, format=None):
points=request.data # user input
s = str(points['string_points'])
closestPoint = getClosestDistance(s)
data = {
'point': s,
'closestPoint': closestPoint
}
serializer = PointsSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
JSON Body для POST запроса. Вводится как пользовательский ввод
{
"string_points": "(2,3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)"
}
Что я упускаю?
Вам нужно передать данные вместе с запросом. Вы можете либо задать данные как атрибут теста, либо просто передать их вместе с запросом.
class TestSetUp(APITestCase):
def setUp(self):
self.getClosestDistance_url = reverse('getClosestDistance')
self.calculateClosestDistance_url = reverse('calcClosestDistance')
self.points = {
"string_points": "(2,3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)"
}
return super().setUp()
def tearDown(self):
return super().tearDown()
class TestViews(TestSetUp):
def test_getClosestPoints_with_no_data(self):
res = self.client.post(self.calculateClosestDistance_url, self.points)
self.assertEqual(res.status_code, 400)
Или с самим тестом;
def test_getClosestPoints_with_no_data(self):
data = {
"string_points": "(2,3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)"
}
res = self.client.post(self.calculateClosestDistance_url, data)
self.assertEqual(res.status_code, 400)