web-dev-qa-db-fra.com

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

Dans un python test unitaire (en réalité Django), quelle est la bonne déclaration assert qui me dira si le résultat de mon test contient la chaîne de mon choix?

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

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

{"car" : ["toyota","honda"]}
52
user798719
self.assertContains(result, "abcd")

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

Utilisation self.assertContains uniquement pour les objets HttpResponse. Pour les autres objets, utilisez self.assertIn.

46
Akshar Raaj

Pour affirmer si une chaîne est ou non une sous-chaîne d'une autre, vous devez utiliser assertIn et assertNotIn:

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

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

Celles-ci sont nouvelles depuis Python 2.7 et Python 3.1

92
Ed I

Vous pouvez écrire une assertion sur la partie attendue d'une chaîne dans une autre chaîne avec un simple assertTrue + in python mot-clé:

self.assertTrue("expected_part_of_string" in my_longer_string)
18
Pierre Criulanscy

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

Puis 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)
8
Vincent Audebert

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 dit:

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

Par conséquent, j'utiliserais plusieurs assertions pour que les messages utiles soient reçus en cas d'échec - les tests devront être compris et conservés à l'avenir, 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']
5
jamesc