使用HttpResponse为函数编写Django单元测试

时间:2017-11-01 19:24:03

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

我正在编写一个单元测试,以检查电视广播键是否在此函数中返回的JSON数据中(在我的views.py中):

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

如您所见,我要检查的JSON是通过HttpResponse发送的变量数据

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

1 个答案:

答案 0 :(得分:2)

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

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

在您的情况下,您可以使用json.loads将其转换为字典,并访问您正在执行的任何值:

import json

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