Django: проверка содержимого типа ответа в тестах - PullRequest
0 голосов
/ 02 июня 2019

У меня есть представление Django, которое возвращает HTTPResponse с типом контента 'application / json'. В своих тестах я хочу убедиться, что был установлен ожидаемый тип контента.

Из документов я вижу, что ответ HTTPResponse, который я могу передать, имеет параметр content_type, но не получает его как атрибут. Почему это так?

В моем 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?

Ответы [ 3 ]

0 голосов
/ 02 июня 2019

вы можете использовать JsonResponse:

from django.http import JsonResponse

return JsonResponse(j)

Нет необходимости устанавливать или проверять content_type и json.dumps в JsonResponse.

0 голосов
/ 21 июня 2019

doc для Django HttpResponse упоминает:

HttpResponse.__getitem__(header)
Возвращает значение для данного имени заголовка.Без учета регистра.

В этом MDN doc упоминается, что в ответе HTTP тип содержимого представляет собой заголовок с именем Content-Type.

, поэтому следующий кодвозвращает тип содержимого Django HttpResponse:

response.__getitem__('Content-Type')

. Это можно использовать в тесте Django, чтобы утверждать, что тип содержимого имеет определенное значение, например, чтобы утверждать, что тип содержимого HttpResponse is application/json:

self.assertEqual(response.__getitem__('content-type'), 'application/json')
0 голосов
/ 02 июня 2019

Оказывается, объект HTTPResponse в Django имеет атрибут _content_type_for_repr. Вот что оно содержало (для меня):

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

Понятия не имею, почему он в этом формате, но его нарезка дала мне то, что я хотел: self.assertEqual(response._content_type_for_repr[3:-1], 'application/json')

(Если у кого-то есть более изящное решение, не стесняйтесь его опубликовать!)

...