web-dev-qa-db-ja.com

クエリパラメータを含むAPITestは、通常のURLとは異なりますか?

すべての書籍を返すか、クエリパラメータで指定されたジャンルの書籍のみを返すAPIに対するいくつかの単体テストを書いています。これは、ローカルの開発サーバーでヒットしたときに機能しているようです。ただし、私の単体テストでジャンルが指定されている場合は、elseステートメントには含まれません。

私の単体テストは次のようになります:

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ビューセットは次のようになります

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.register(r'api/titles-and-blurbs', TitlesAndBlurbsListViewSet)

ブラウザで「api/titles-and-blurbs /?genre = horror」というURLにアクセスすると、ジャンルホラーなプリントステートメントとタイトル、ブラーブが表示されます。ただし、テストスイートでヒットすると、printステートメントのジャンルが表示されず、「i dont have query params」のprintステートメントが表示され、すべての書籍が返されます。どんな助けでも本当に感謝しています。

28
user133688

代わりに、クエリパラメータをデータペイロードとして渡してみてください。テストの行を次のように変更します。

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

Django docs here クエリパラメータをURLで渡すさまざまな方法について。

別の人が、DRFのテスト中に空のQUERY_PARAMSで同様の問題を報告しました( ここ を参照)。彼らはそれを修正したようですが、おそらく何かを見落としたか、更新を取得できませんでした。

43
Alex