python - serialized - Cómo usar assertJSONEqual de Django para verificar la respuesta de la vista que devuelve JsonResponse
json response django rest (2)
De manera similar a la solución de respondcreate, también puede usar el force_text de Django (disponible desde la versión 1.5), para una solución multiplataforma más corta:
from __future__ import unicode_literals
from django.utils.encoding import force_text
class AddItemToCollectionTest(TestCase):
def test_success_when_not_added_before(self):
response = self.client.post(''/add-item-to-collection'')
self.assertEqual(response.status_code, 200)
self.assertJSONEqual(force_text(response.content), {''status'': ''success''})
Estoy usando Python 3.4 y Django 1.7. Tengo una vista de regresar JsonResponse
.
def add_item_to_collection(request):
#(...)
return JsonResponse({''status'':''success''})
Quiero verificar si esa vista devuelve la respuesta correcta usando la prueba unitaria:
class AddItemToCollectionTest(TestCase):
def test_success_when_not_added_before(self):
response = self.client.post(''/add-item-to-collection'')
self.assertEqual(response.status_code, 200)
self.assertJSONEqual(response.content, {''status'': ''success''})
Sin embargo, la línea assertJSONEqual()
genera una excepción:
Error
Traceback (most recent call last):
File "E:/Projects/collecthub/app/collecthub/collecting/tests.py", line 148, in test_success_when_added_before
self.assertJSONEqual(response.content, {''status'': ''OK''})
File "E:/Projects/collecthub/venv/lib/site-packages/django/test/testcases.py", line 675, in assertJSONEqual
data = json.loads(raw)
File "C:/Python34/Lib/json/__init__.py", line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not ''bytes''
¿Cuál es la forma correcta de verificar el contenido de la respuesta, cuando la respuesta contiene JSON? ¿Por qué assertJSONEqual()
un error de tipo cuando intento comparar un valor bruto contra un assertJSONEqual()
en assertJSONEqual()
?
Parece que estás trabajando con Python 3, por lo que deberás convertir response.content
en una cadena codificada en UTF-8 antes de pasarla a self.assertJSONEqual
:
class AddItemToCollectionTest(TestCase):
def test_success_when_not_added_before(self):
response = self.client.post(''/add-item-to-collection'')
self.assertEqual(response.status_code, 200)
self.assertJSONEqual(
str(response.content, encoding=''utf8''),
{''status'': ''success''}
)
Si desea admitir simultáneamente Python 2.7 y Python 3, use la biblioteca de six
compatibilidad que Django incluye :
from __future__ import unicode_literals
from django.utils import six
class AddItemToCollectionTest(TestCase):
def test_success_when_not_added_before(self):
response = self.client.post(''/add-item-to-collection'')
self.assertEqual(response.status_code, 200)
response_content = response.content
if six.PY3:
response_content = str(response_content, encoding=''utf8'')
self.assertJSONEqual(
response_content,
{''status'': ''success''}
)