【问题标题】:Django and JSON/AJAX testingDjango 和 JSON/AJAX 测试
【发布时间】:2016-12-06 12:26:58
【问题描述】:

我尝试四处寻找答案并尝试了很多次,但是这里发生了一些奇怪的事情。在我看来,我有一些函数可以对通过 AJAX 传入的 JSON 数据进行操作。目前我正在尝试对这些进行一些单元测试。

在我的测试用例中,我有:

kwargs = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
url = '/<correct_url>/upload/'
data = {
                "id" : p.id
}

c = Client()
response = c.delete(url, data, **kwargs)

content_unicode = response.content.decode('utf-8')
content = json.loads(content_unicode)

p.id 只是一个来自我正在使用的模型的整数。

然后我有一个正在测试的函数,其中部分如下所示:

def delete_ajax(self, request, *args, **kwargs):
    print (request.body)
    body_unicode = request.body.decode('utf-8')
    print (body_unicode)
    body_json = json.loads(body_unicode)

第一个打印语句产生:

.....b"{'id': 1}"

另一个:

{'id': 1}

最后我得到第四行的错误如下:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

这里出了什么问题?我知道正确的 JSON 格式应该是{"id": 1},这就是我从我的测试用例中发送的内容。但是在某个地方,单引号被引入到组合中,让我头疼。

有什么想法吗?

【问题讨论】:

    标签: python json ajax django


    【解决方案1】:

    您需要将 json 字符串传递给 Client.delete(),而不是 Python 字典:

    kwargs = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
    url = '/<correct_url>/upload/'
    data = json.dumps({
     "id" : p.id
     })
    
    c = Client()
    response = c.delete(url, data, **kwargs)
    

    您还应该将 content-type 标头设置为“application/json”并检查您视图中的 content-type 标头,但这是另一个主题。

    【讨论】:

    • 谢谢!我几乎在你回答之前就明白了,但你还是更快。内容类型检查是接下来要处理的事情:)
    猜你喜欢
    • 2021-03-02
    • 2011-06-15
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多