Was ist in einem Python-Unit-Test (eigentlich Django) die richtige assert
Aussage, die mir sagt, ob mein Testergebnis eine Zeichenfolge meiner Wahl enthält?
self.assertContainsTheString(result, {"car" : ["toyota","honda"]})
Ich möchte sicherstellen, dass my result
mindestens das json-Objekt (oder die Zeichenfolge) enthält, das ich oben als zweites Argument angegeben habe
{"car" : ["toyota","honda"]}
Antworten:
self.assertContains(result, "abcd")
Sie können es so ändern, dass es mit json funktioniert.
Verwenden Sie
self.assertContains
nur fürHttpResponse
Objekte. Verwenden Sie für andere Objekteself.assertIn
.quelle
Zu, wenn ein String ist oder nicht , eine Teil eines anderen, sollten Sie verwenden
assertIn
undassertNotIn
:# Passes self.assertIn('bcd', 'abcde') # AssertionError: 'bcd' unexpectedly found in 'abcde' self.assertNotIn('bcd', 'abcde')
Diese sind seit Python 2.7 und Python 3.1 neu
quelle
assertIn
hilfreiche Nachrichten bei einem Fehler , wie Sie dargestellt haben.Sie können eine Zusicherung über den erwarteten Teil eines Strings in einen anderen String mit einem einfachen assertTrue + in Python-Schlüsselwort schreiben:
self.assertTrue("expected_part_of_string" in my_longer_string)
quelle
Erstellen Sie ein JSON-Objekt mit
json.dumps()
.Dann vergleichen Sie 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)
quelle
assertTrue()
stattassertEqual()
? Zumindest mitassertEqual()
druckt das Modul sowohl das Ergebnis als auch die erwarteten Werte.dumps()
eine willkürliche Reihenfolge verwendet und wir die Reihenfolge der Schlüssel in nicht kennenresult
. Sie wären viel besser dranself.assertEqual(json.loads(result), expected_dict)
.Wie von Ed I erwähnt ,
assertIn
ist dies wahrscheinlich die einfachste Antwort, um eine Zeichenfolge in einer anderen zu finden. Die Frage lautet jedoch:Daher würde ich mehrere Behauptungen verwenden, damit bei einem Fehler hilfreiche Nachrichten empfangen werden. Tests müssen in Zukunft verstanden und gepflegt werden, möglicherweise von jemandem, der sie ursprünglich nicht geschrieben hat. Nehmen wir also an, 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'])
Welches 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']
quelle
Ich befand mich in einem ähnlichen Problem und benutzte das Attribut render_content , also schrieb ich
assertTrue('string' in response.rendered_content)
und ähnlichassertFalse('string' in response.rendered_content)
wenn ich testen möchte, dass eine Zeichenfolge nicht gerendert wirdAber es funktionierte auch die früh vorgeschlagene Methode,
AssertContains(response, 'html string as rendered')
Also würde ich sagen, dass der erste einfacher ist. Ich hoffe es wird helfen.
quelle