the serialized safe parameter objects non false dict allow python django python-3.x django-testing jsonresponse

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''} )