Как передать данные из тела запроса в модульном тесте django

Я модифицировал метод get_queryset(), который выглядит следующим образом:

def get_queryset(self):

        type_of_review = self.request.data['type_of_review']
        queryset = Reviews.objects.filter(type_of_review=type_of_review).order_by('-id')[:3]
        return queryset

Он сортирует мои модели по полю type_of_review, упорядочивает их и извлекает 3 последними. Когда я пытался написать модульный тест для этого, я столкнулся с проблемой, что не могу найти надежный или рабочий способ передать аргумент filter в метод get_queryset().

Я пытался сделать это следующим образом:

def test_list_three_review(self):

        self.data = [ReviewsFactory.create() for i in range(10)]
        response = self.client.get(self.url2, type_of_review='Team')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

Но получил ошибку: test_list_three_review - KeyError: 'type_of_review'. Может кто-нибудь объяснить мне, что я делаю не так? С радостью предоставлю любую дополнительную информацию. В любом случае спасибо!

OK, итак, self.client.get принимает данные, которые должны быть словарем. Я думаю, вы хотите сделать следующее...

def test_list_three_review(self):
    [ReviewsFactory.create() for i in range(10)]
    data = {'type_of_review':'Team'}
    response = self.client.get(self.url2, data)
    self.assertEqual(response.status_code, status.HTTP_200_OK)

Не совсем понимаю, зачем вам включать список объектов в запрос, поскольку ваш метод get_queryset все равно его переопределяет.

Вы передаете данные как параметр строки запроса. Чтобы разобрать его в представлении, вы можете использовать request.GET.get("type_of_review")

ваш метод get_queryset() станет

def get_queryset(self):

        type_of_review = self.request.GET.get('type_of_review')
        queryset = Reviews.objects.filter(type_of_review=type_of_review).order_by('-id')[:3]
        return queryset

GET запрос не предназначен для передачи json данных, если вам нужно передать данные в формате json, вы можете использовать метод POST

тогда вы можете передать данные типа

def test_list_three_review(self):

    self.data = [ReviewsFactory.create() for i in range(10)]
    data = {"type_of_review": "Team"}
    response = self.client.post(self.url2, data)
    self.assertEqual(response.status_code, status.HTTP_200_OK)

и ваш метод get_queryset будет работать как есть.

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