【问题标题】:Writing a Django unit test for a function with a HttpResponse使用 HttpResponse 为函数编写 Django 单元测试
【发布时间】:2018-04-14 04:56:06
【问题描述】:

我正在编写一个单元测试来检查 telecasts 键是否在此函数返回的 JSON 数据中(在我的 views.py 中):

def my_function(request, date1='', date2='', date3='', date4=''):
    ::some other functions...::
    return HttpResponse(data, content_type='application/json')

如您所见,我要检查的 JSON 是通过 HttpResponse 作为变量 data

发送的

在前端收到此 JSON 数据时,其结构如下:

{"records": [ {"program": "WWE ENTERTAINMENT", "telecasts": 201,...}, {..} ]

所以这就是我尝试编写单元测试的方式,但是当我运行它时出现错误:

    def my_test(self):
    """Data returned has telecasts key"""

    request = self.client.get(
        '/apps/myapp/2014-08-01/2015-06-10/2016-01-13/2016-03-23/',
        {dictionary of optional parameters}
    )

    force_authenticate(request, user=self.user)

    response = my_function(
        request,
        '2014-08-01',
        '2015-06-10',
        '2016-01-13',
        '2016-03-23'
    )

    telecasts_check = response['records'][0]['telecasts']
    self.assertRaises(KeyError, lambda: telecasts_check)

【问题讨论】:

  • 您似乎对self.client.get 的作用感到困惑。它不是构造请求,而是通过测试客户端调用您的实际视图。因此,如果您正在使用它,则无需像您一样通过直接调用该函数来获取response

标签: python json django unit-testing django-unittest


【解决方案1】:

self.client.get 发出请求并返回响应,因此完全没有必要直接调用myfunction 来获取下面的响应。

另一件事是,HttpResponse 有一个名为content 的属性,它可以是存储响应内容的字节串或迭代器。

在您的情况下,您可以使用 json.loads 将其转换为字典并访问任何值,就像您已经在做的那样:

import json

def my_test(self):
    ...
    response = self.client.get(...)
    result = json.loads(response.content)
    telecasts_check = result['records'][0]['telecasts']
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多