web-dev-qa-db-fra.com

APITest avec les paramètres de requête est-il différent de l'URL normale?

J'écris des tests unitaires contre une API qui retourne tous les livres ou ne renvoie que les livres du genre donné dans les paramètres de requête. Cela semble fonctionner lorsque je le frappe sur mon serveur de développement local. Cependant, il n'entre même pas dans l'instruction else si le genre est spécifié dans mon test unitaire.

Mon test unitaire ressemble à ceci:

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()) 

Mon ensemble de vues API ressemble à ceci

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()

mon URL/routeur ressemble

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

Lorsque je clique sur l'URL "api/titres-et-textes /? Genre = horreur" dans mon navigateur, j'obtiens la déclaration imprimée et les titres et textes présentant le genre d'horreur. Cependant, lorsque je frappe dans la suite de tests, je n'obtiens pas le genre de déclaration d'impression, je reçois la déclaration d'impression de "je n'ai pas de paramètres de requête", et il renvoie tous les livres. Toute aide est vraiment appréciée.

28
user133688

Essayez plutôt de passer le paramètre de requête en tant que charge utile de données. Changez la ligne de votre test en:

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

Django docs ici sur les différentes façons de passer les paramètres de requête dans les URL.

Une autre personne a signalé un problème similaire avec un QUERY_PARAMS vide lors du test de DRF (voir ici ). On dirait qu'ils l'ont corrigé mais peut-être qu'ils ont raté quelque chose ou que vous n'avez pas reçu la mise à jour.

43
Alex