webentwicklung-frage-antwort-db.com.de

Python / Django: Wie kann man behaupten, dass das Unit-Testergebnis eine bestimmte Zeichenfolge enthält?

Was ist in einem python unit test (eigentlich Django)) die richtige assert Anweisung, die mir sagt, ob mein Testergebnis eine Zeichenfolge meiner Wahl enthält?

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

Ich möchte sicherstellen, dass mein result mindestens das json-Objekt (oder den String) enthält, das ich als zweites Argument oben angegeben habe

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

Sie können es so ändern, dass es mit json funktioniert.

Verwenden self.assertContains nur für HttpResponse Objekte. Verwenden Sie für andere Objekte self.assertIn.

46
Akshar Raaj

Um festzustellen, ob eine Zeichenfolge eine Teilzeichenfolge einer anderen ist oder nicht, sollten Sie assertIn und assertNotIn verwenden:

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

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

Diese sind neu seit Python 2.7 und Python 3.1

92
Ed I

Mit einem einfachen assertTrue + in python Schlüsselwort:

self.assertTrue("expected_part_of_string" in my_longer_string)
18

Erstellen Sie ein JSON-Objekt mit json.dumps().

Dann vergleiche sie mit 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

Wie von Ed I erwähnt , assertIn ist wahrscheinlich die einfachste Antwort, um eine Zeichenfolge in einer anderen zu finden. Die Frage lautet jedoch:

Ich möchte sicherstellen, dass mein result mindestens das json-Objekt (oder den String) enthält, das ich als zweites Argument oben angegeben habe, d. H. {"car" : ["toyota","honda"]}

Daher würde ich mehrere Behauptungen verwenden, damit hilfreiche Nachrichten bei Fehlern eingehen. Tests müssen in Zukunft verstanden und gepflegt werden, möglicherweise von jemandem, der sie ursprünglich nicht geschrieben hat. Angenommen, wir befinden uns in einem 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'])

Das gibt hilfreiche Nachrichten wie folgt:

# 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