带有查询参数的 APITest 与普通 url 不同吗?

Posted

技术标签:

【中文标题】带有查询参数的 APITest 与普通 url 不同吗?【英文标题】:Is APITest with Query params different then just normal url? 【发布时间】:2014-06-20 12:06:52 【问题描述】:

我正在针对返回所有书籍或仅返回查询参数中给定类型的书籍的 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()

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

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

当我在浏览器中点击 url 'api/titles-and-blurbs/?genre=horror' 时,我会看到具有恐怖类型的打印声明以及标题和简介。然而,当我击中 测试套件,我没有得到打印语句类型我得到“我没有查询参数”的打印语句,它返回所有书籍。任何帮助都是真的 赞赏。

【问题讨论】:

只是为了测试哪里出了问题,你会稍微改变一下你的视图代码吗?更改它,使if not genre 返回与self.action == 'list' 不正确时所获得的不同的结果。基本上,我想看看它在 哪个 点出现了问题:动作是否不在列表中,或者它是否没有获得流派。找到后可以改回来。 它进入 self.action == 'list' - 我知道这是因为还有另一个 if 语句我没有显示该操作,因为它不相关。 【参考方案1】:

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

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

Django 文档here 介绍了在 url 中传递查询参数的不同方式。

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

【讨论】:

就是这样。很奇怪。我在 Django==1.6.2 djangorestframework==2.3.13 @user2734679 是的,看看 PyPi,他们似乎在更新后还没有发布新包。

以上是关于带有查询参数的 APITest 与普通 url 不同吗?的主要内容,如果未能解决你的问题,请参考以下文章

接口测试 - 用Postman进行Apitest

带有查询参数的 Django url 模板

从 URL 获取查询参数,该 URL 又具有一些带有查询参数的 URL

可以将 CNAME 指向带有查询参数的参数化 URL 吗?

如何将带有查询字符串的 url 作为 api 参数传递?

带有普通查询字符串的 HttpClient GET 请求(连同 oAuth1.0)