unittest unitarias unit test pruebas not integracion equal automatizadas python json django unit-testing assert

python - unitarias - unittest



Python/Django: ¿cómo afirmar que el resultado de la prueba unitaria contiene una cierta cadena? (6)

Construya un objeto JSON usando json.dumps() .

Luego, compare usando assertEqual(result, your_json_dict)

import json expected_dict = {"car":["toyota", "honda"]} expected_dict_json = json.dumps(expected_dict) self.assertEqual(result, expected_dict_json)

En una prueba de unidad de Python (en realidad, Django), ¿cuál es la afirmación de afirmación correcta que me dirá si el resultado de mi prueba contiene una secuencia de mi elección?

es decir, algo así como self.assertContainsTheString(result, {"car" : ["toyota","honda"]})

Quiero asegurarme de que mi result contenga al menos el objeto json (o cadena) que especifiqué como el segundo argumento anterior, es decir, {"car" : ["toyota","honda"]}


Me encontré en un problema similar y usé el atributo rendered_content , así que escribí

assertTrue(''string'' in response.rendered_content) y similarmente

assertFalse(''string'' in response.rendered_content) si quiero probar que una cadena no se procesa

Pero también funcionó el método sugerido temprano,

AssertContains(response, ''html string as rendered'')

Entonces diría que el primero es más directo. Espero que ayude


Para afirmar si una cadena es o no es una subcadena de otra, debe usar assertIn y assertNotIn :

# Passes self.assertIn(''bcd'', ''abcde'') # AssertionError: ''bcd'' unexpectedly found in ''abcde'' self.assertNotIn(''bcd'', ''abcde'')

Estos son nuevos desde Python 2.7 y Python 3.1


Puede escribir la afirmación sobre la parte esperada de la cadena en otra cadena con una simple palabra clave assertTrue + en python:

self.assertTrue("expected_part_of_string" in my_longer_string)


Como lo mencionó Ed I , assertIn es probablemente la respuesta más simple para encontrar una cadena en otra. Sin embargo, la pregunta dice:

Quiero asegurarme de que mi result contenga al menos el objeto json (o cadena) que especifiqué como el segundo argumento anterior, es decir, {"car" : ["toyota","honda"]}

Por lo tanto, utilizaría múltiples aserciones para que se reciban mensajes útiles sobre la falla: las pruebas deberán ser entendidas y mantenidas en el futuro, posiblemente por alguien que no las haya escrito originalmente. Por lo tanto, django.test.TestCase que estamos dentro de un django.test.TestCase :

# Check that `car` is a key in `result` self.assertIn(''car'', result) # Compare the `car` to what''s expected (assuming that order matters) self.assertEqual(result[''car''], [''toyota'', ''honda''])

Que da mensajes útiles de la siguiente manera:

# If ''car'' isn''t in the result: AssertionError: ''car'' not found in {''context'': ..., ''etc'':... } # If ''car'' entry doesn''t match: AssertionError: Lists differ: [''toyota'', ''honda''] != [''honda'', ''volvo''] First differing element 0: toyota honda - [''toyota'', ''honda''] + [''honda'', ''volvo'']


self.assertContains(result, "abcd")

Puedes modificarlo para que funcione con json.

Utilice self.assertContains solo para objetos HttpResponse . Para otros objetos, use self.assertIn .