Выполнение модульного тестирования в 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)
Вернуться на верх