2014-05-04 13 views
13

Sto scrivendo alcuni test unitari contro un'API che restituisce tutti i libri o restituisce solo i libri del genere specificato nei parametri della query. Questo sembra funzionare quando l'ho colpito nel mio server di sviluppo locale. Tuttavia, non entra nemmeno nella dichiarazione else se il genere è specificato nel mio test unitario.APITest con parametri Query diversi dall'URL normale?

Il mio test di unità si presenta così:

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

mio api viewset assomiglia a questo

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

mio url/router si presenta come

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

Quando mi ha colpito l'url ' api/titles-and-blurbs /? genre = horror 'nel mio browser ottengo la dichiarazione di stampa e titoli e blurb che hanno il genere horror. Tuttavia, quando premo nella suite di test , non ottengo il genere di istruzioni di stampa. Ottengo l'istruzione print di "non ho parametri di query" e restituisce tutti i libri. Qualsiasi aiuto è davvero apprezzato .

+0

Solo per verificare dove sta andando male, cambieresti un po 'il codice di visualizzazione? Modificalo in modo che "if not genere" restituisca qualcosa di diverso da ciò che ottieni se "self.action == 'list'' non è True. Fondamentalmente, mi piacerebbe vedere a * quale * punto si sta rompendo: se l'azione non è lista o se non sta ottenendo un genere. Puoi cambiarlo dopo averlo trovato. – Alex

+0

Entra in self.action == 'list' - Lo so perché c'è un'altra dichiarazione if l'azione che non sto visualizzando perché non è rilevante. – user2734679

risposta

22

Provare a passare invece il parametro query come carico utile dati. Modificare la riga nel test per:

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

Django docs here sui diversi modi per passare i parametri di query negli URL.

Un'altra persona ha segnalato un problema simile con un QUERY_PARAMS vuoto durante il test del DRF (vedere here). Sembra che l'abbiano risolto, ma forse hanno perso qualcosa o non hai ricevuto l'aggiornamento.

+0

Era così. Molto strano. I'm on Django == 1.6.2 djangorestframework == 2.3.13 – user2734679

+1

@ user2734679 Sì, guardando PyPi, sembra che non abbiano rilasciato un nuovo pacchetto dall'aggiornamento. – Alex

Problemi correlati