it-swarm.dev

Python / Django: كيف تؤكد أن نتيجة اختبار الوحدة تحتوي على سلسلة معينة؟

في python unit test (في الواقع Django) ، ما هي العبارة الصحيحة assert التي ستخبرني إذا كانت نتيجة الاختبار الخاصة بي تحتوي على سلسلة من اختياراتي؟

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

أريد أن أتأكد من أن result يحتوي على كائن json (أو السلسلة) على الأقل الذي حددته كوسيطة ثانية أعلاه

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

يمكنك تعديله للعمل مع json.

استعمال self.assertContains فقط لكائنات HttpResponse. للكائنات الأخرى ، استخدم self.assertIn.

46
Akshar Raaj

لتأكيد ما إذا كانت السلسلة سلسلة فرعية لسلسلة أخرى أم لا ، يجب عليك استخدام assertIn و assertNotIn:

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

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

هذه جديدة منذ Python 2.7 و Python 3.1

92
Ed I

يمكنك كتابة تأكيد حول الجزء المتوقع من السلسلة في سلسلة أخرى باستخدام assertTrue بسيط + في python الكلمة الأساسية:

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

قم ببناء كائن JSON باستخدام json.dumps().

ثم قارنهم باستخدام 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

كما ذكر Ed I ، assertIn ربما تكون أبسط إجابة لإيجاد سلسلة واحدة في أخرى. ومع ذلك ، فإن السؤال ينص على:

أريد أن أتأكد من احتواء result على الأقل على كائن (أو سلسلة) json الذي حددته كوسيطة ثانية أعلاه ، على سبيل المثال ، {"car" : ["toyota","honda"]}

لذلك ، سأستخدم تأكيدات متعددة بحيث يتم تلقي رسائل مفيدة عند الفشل - يجب فهم الاختبارات والحفاظ عليها في المستقبل ، ويحتمل أن يقوم بها شخص لم يكتبها أصلاً. لذلك على افتراض أننا داخل 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'])

الذي يعطي رسائل مفيدة على النحو التالي:

# 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