带有查询参数的APITest是否与普通网址不同?

use*_*688 28 django unit-testing django-testing django-rest-framework

我正在针对一个API编写一些单元测试,该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()) 
Run Code Online (Sandbox Code Playgroud)

我的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()
Run Code Online (Sandbox Code Playgroud)

我的网址/路由器看起来像

router.register(r'api/titles-and-blurbs', TitlesAndBlurbsListViewSet)
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中点击网址'api/titles-and-blurbs /?genre = horror'时,我得到了打印声明以及具有类型恐怖的标题和模糊.然而,当我进入测试套件时,我没有得到print语句类型我得到'我没有查询参数'的打印语句,它返回所有书籍.任何帮助都非常感谢.

Ale*_*lex 49

尝试将查询参数作为数据有效负载传递.将测试中的行更改为:

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

Django 在这里讲述了在url中传递查询参数的不同方法.

另一个人在测试DRF时报告了一个空的QUERY_PARAMS的类似问题(参见此处).看起来他们修复了它,但也许他们错过了一些东西,或者你没有得到更新.