Django:检查测试中响应的内容类型

时间:2019-06-02 09:23:52

标签: django testing content-type

我有Django视图,该视图返回内容类型为'application / json'的HTTPResponse。在测试中,我想验证是否设置了预期的内容类型。

docs中,我看到我可以传递的content_type HTTPResponse有一个参数,而不是将其作为属性。为什么会这样?

在我的views.py中,我构建并发送如下的HTTPResponse:

j = json.dumps(j)
return HttpResponse(j, content_type='application/json')

在我的tests.py中,我想做类似的事情

self.assertEqual(response.content_type, 'application/json')

但是在HTTPResponse对象上没有该属性,该问题当然会因AttributeError: 'HttpResponse' object has no attribute 'content_type'

而失败

如何在Django中获取响应的内容类型?对HTTP的运作方式有误解吗?

4 个答案:

答案 0 :(得分:0)

事实证明,Django中的HTTPResponse对象具有_content_type_for_repr属性。 这是(对我来说)包含的内容:

print(response._content_type_for_repr)
, "application/json"

我不知道为什么采用这种格式,但是将其切成薄片让我可以找到想要的位置: self.assertEqual(response._content_type_for_repr[3:-1], 'application/json')

(如果有人对此有更好的解决方案,请不要犹豫将其发布!)

答案 1 :(得分:0)

您可以使用JsonResponse

from django.http import JsonResponse

return JsonResponse(j)

无需在content_type中设置或测试json.dumpsJsonResponse

答案 2 :(得分:0)

Django HttpResponse的{​​{3}}提到:

  

HttpResponse.__getitem__(header)
  返回给定标题名称的值。不区分大小写。

此MDN doc提到在HTTP响应中,内容类型是标题为Content-Type的标头。

因此,以下代码返回Django HttpResponse的内容类型:

response.__getitem__('Content-Type')

这可以在Django测试中用于断言Content Type具有某个值,例如断言HttpResponse的Content Type为application/json

self.assertEqual(response.__getitem__('content-type'), 'application/json')

答案 3 :(得分:0)

最简单的方法是<select> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> </select> <button onclick="myFunction()">set</button> <script> function myFunction() { var x = document.title; } </script> ,在您的情况下,它将返回response['content-type']。因此,要测试您可以使用:

'application/json'