Ist APITest mit Query params anders ist, dann einfach die normale url?
Schreibe ich einige unit-tests gegen eine API, die entweder liefert alle Bücher, oder gibt nur die Bücher der Genres in der query params. Dies scheint zu funktionieren, wenn ich ihn treffe in meinem lokalen dev-server. Jedoch, es gar nicht gehen in der else-Anweisung, wenn das genre ist angegeben in meinem unit-test.
Mein unit-test sieht wie folgt aus:
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())
Mein api-viewset sieht wie folgt aus
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()
meine url/router sieht aus wie
router.register(r'api/titles-and-blurbs', TitlesAndBlurbsListViewSet)
Wenn ich auf die url 'api/Titel-und-kleinere Texte/?genre=horror' in meinem browser erhalte ich die print-Anweisung und Titel und blurbs, dass das genre horror. Allerdings, wenn ich Treffer in den
test-suite habe ich nicht die print-Anweisung genre bekomme ich die print-Anweisung von 'i dont haben-query params', und es gibt alle Bücher. Jede Hilfe ist wirklich
geschätzt.
- Nur um zu testen, wo es schief geht, würde Sie Ihre Ansicht ändern code ein wenig? Ändern Sie es so
if not genre
gibt etwas anderes als das, was Sie erhalten, wennself.action == 'list'
ist nicht Wahr. Im Grunde, würde ich mag, um zu sehen, an welcher Stelle es zu brechen: ob die Aktion ist nicht auf der Liste ist oder ob es nicht immer ein genre. Sie können es ändern, zurück, nachdem Sie feststellen, dass. - Es wird in das selbst.action == 'Liste' - ich weiß, es ist da eine weitere if-Anweisung die Aktion, die ich nicht anzeigen, weil Sie nicht relevant sind.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, die übergabe der query-parameter als Daten-Nutzlast statt. Ändern Sie die Zeile in Ihrem test:
Django-docs hier auf die verschiedenen Möglichkeiten zum übergeben von Abfragezeichenfolgen-Parameter in urls.
Einer anderen person berichtet, ein ähnliches Problem mit einem leeren QUERY_PARAMS beim testen DRF (siehe hier). Es sieht aus wie Sie es behoben, aber vielleicht haben Sie etwas verpasst haben oder Sie leider nicht bekommen das update.