Является ли APITest с параметрами запроса разными, а не только нормальным URL?

Я пишу некоторые модульные тесты против API, которые либо возвращают все книги, либо возвращают только книги данного жанра в параметрах запроса. Кажется, это работает, когда я ударил его на своем локальном сервере dev. Тем не менее, он даже не входит в инструкцию else, если жанр указан в моем unit test.

Мой unit test выглядит следующим образом:

class TitlesAndBlurbsListTestCase(APITestCase):
     def setUp(self):
     # Creates a lot of books with genre horror
     # and books not in the horror genre

     def test_horror_genre(self):
         # Ensure that screener can see all the available books
         self.client.login(username='b', password='b')
         response = self.client.get('/api/titles-and-blurbs/?genre=horror')
         self.assertEqual(response.status_code, status.HTTP_200_OK)

         # Ensure that the screener gets all horror books at first
         horror_books = TitlesAndBlurbs.objects.filter(genre='horror')
         # I keep getting an assertion error here - it returns all the books
         self.assertEqual(len(response.data), horror_books.count()) 

Мой api viewet выглядит следующим образом

class TitlesAndBlurbsListViewSet(viewsets.mixins.ListModelMixin,
               viewsets.mixins.RetrieveModelMixin,
               viewsets.GenericViewSet):
    model = TitlesAndBlurbs
    permission_classes = [ScreenerPermissions]
    serializer_class = TitlesAndBlurbsSerializer

    def get_queryset(self):
        if self.action == 'list':
            genre = self.request.QUERY_PARAMS.get('genre', None)
            if not genre:
                print 'i dont have query params of genre'
                TitlesAndBlurbs.objects.all()
            else:
                print genre
                TitlesAndBlurbs.objects.filter(genre=genre)
        return TitlesAndBlurbs.objects.all()

мой url/router выглядит как

router.register(r'api/titles-and-blurbs', TitlesAndBlurbsListViewSet)

Когда я попал в URL-адрес "api/titles-and-blurbs/? genre = horror" в моем браузере, я получаю выражение о печати и заголовки и рекламные ролики, у которых есть ужас жанра. Однако, когда я попал в тестовый набор, я не получаю жанр описания печати. ​​Я получаю инструкцию печати "Я не имею параметров запроса", и он возвращает все книги. Любая помощь действительно оценили.

Ответ 1

Попробуйте вместо этого передать параметр запроса в качестве данных. Измените строку в своем тесте на:

response = self.client.get('/api/titles-and-blurbs/', {'genre': 'horror'})

Документация Django здесь о различных способах передачи параметров запроса в URL.

Другой человек сообщил о похожей проблеме с пустым QUERY_PARAMS во время тестирования DRF (см. здесь). Похоже, они это исправили, но, возможно, они что-то пропустили или вы не получили обновление.