96 votes

Python/Django : comment affirmer que le résultat d'un test unitaire contient une certaine chaîne ?

Dans un test unitaire en python (en fait Django), quelle est la bonne façon d'utiliser le test unitaire ? assert qui me dira si le résultat de mon test contient une chaîne de caractères de mon choix ?

self.assertContainsTheString(result, {"car" : ["toyota","honda"]})

Je veux m'assurer que mon result contient au moins l'objet json (ou la chaîne) que j'ai spécifié comme deuxième argument ci-dessus

{"car" : ["toyota","honda"]}

150voto

Ed Saito Points 1403

Pour affirmer qu'une chaîne est ou n'est pas une sous-chaîne d'une autre, vous devez utiliser assertIn y assertNotIn :

# Passes
self.assertIn('bcd', 'abcde')

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

Ceux-ci sont nouveaux depuis Python 2.7 y Python 3.1

75voto

akshar Points 2286
self.assertContains(result, "abcd")

Vous pouvez le modifier pour qu'il fonctionne avec json.

Utilice self.assertContains seulement pour HttpResponse objets. Pour les autres objets, utilisez self.assertIn .

26voto

Pcriulan Points 249

Vous pouvez écrire une assertion sur la partie attendue d'une chaîne de caractères dans une autre chaîne de caractères avec un simple assertTrue + en mot clé python :

self.assertTrue("expected_part_of_string" in my_longer_string)

10voto

Construire un objet JSON en utilisant json.dumps() .

Ensuite, comparez-les en utilisant 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)

10voto

jamesc Points 1076

Comme mentionné par Ed I , assertIn est probablement la réponse la plus simple pour trouver une chaîne dans une autre. Cependant, la question précise :

Je veux m'assurer que mon result contient au moins l'objet json (ou la chaîne) que j'ai spécifié comme deuxième argument ci-dessus, c'est-à-dire, {"car" : ["toyota","honda"]}

C'est pourquoi j'utiliserais plusieurs assertions afin que des messages utiles soient reçus en cas d'échec - les tests devront être compris et maintenus dans le futur, potentiellement par quelqu'un qui ne les a pas écrits à l'origine. Par conséquent, en supposant que nous sommes à l'intérieur d'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'])

Ce qui donne des messages utiles comme suit :

# 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']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X