Как передать данные из тела запроса в модульном тесте 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 будет работать как есть.