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.
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.