تعامل مع خطأ ValueError عند اختبار دالة مموهة في بايثون
تعد عملية اختبار الوحدات من العمليات الأساسية لضمان جودة وأمان البرامج، حيث تساهم في تحديد الأخطاء قبل أن تتسبب في مشكلات أكبر. لكن أحيانًا، قد نواجه بعض التحديات أثناء استخدام مكتبات التزوير (Mocking) في بايثون. في هذا المقال، سنناقش إحدى المشكلات الشائعة التي قد تعترض طريق المبرمجين عند التحقق من استدعاء الدوال المزوّرة، وهي مشكلة: "ValueError: not enough values to unpack (expected 2, got 0)".
ما هي الدوال المزوّرة في بايثون؟
تُستخدم الدوال المزوّرة (Mock Functions) في اختبار الوحدات لتقليد سلوك دوال أخرى دون تنفيذ فعلي لها، مما يسمح للفرق بضمان أن أجزاء معينة من التعليمات البرمجية تعمل كما هو متوقع. ومن خلال التزوير، يستطيع المطورون اختبار سلوك الوظائف المعقدة دون الحاجة إلى الاعتماد على البيانات الخارجية أو الموارد.
الفهم العميق لمشكلة ValueError
الخطأ "ValueError: not enough values to unpack (expected 2, got 0)" يظهر عادةً عندما يُتوقع أن تُعيد دالة ما قيمتين، ولكن الدالة تعيد قيمة فارغة أو قيمة واحدة فقط. في سياق الكود المذكور، لدينا دالة run_this_function
التي تُستدعى داخل go_to_the_right_street
. إذا لم تُستدعى run_this_function
بشكل صحيح، سيتوجب على بايثون إلقاء هذا الخطأ.
تحليل الحالة الخاصة بك
في الكود الخاص بك، هناك تعديل يجب أن يتم على السلسلة التالية في (app.py):
action, extra_information = run_this_function('something)
تأكد من وجود علامة اقتباس في نهاية السلسلة لتعكس استدعاء الدالة بشكل صحيح. بعد إجراء هذا التعديل، ستكون الدالة run_this_function
قادرة على إرجاع القيم المطلوبة.
تطبيق الاختبارات بنجاح
في ملف test_app.py
، نستخدم مكتبة unittest.mock
لإجراء الاختبار. يجب أن تتأكد من أن الوظيفة المزوّرة run_this_function_patch
تعيد القيم بالطريقة المناسبة التي تُستخدم في الدالة التي نختبرها.
بينما يتم استدعاء الدالة go_to_the_right_street
, ينبغي أن تختبر سلوك run_this_function
المزوّر وتتحقق مما إذا كان قد تم استدعاؤه مرة واحدة فقط، مثل هذا:
mocked_function.assert_called_once()
إذا كان هناك أي تغييرات على side_effect
، ينبغي أن تكون على الشكل التالي:
mocked_function.side_effect = [run_this_function_patch('something')]
هذا يضمن أن كل استدعاء للوظيفة المزوّرة يعود بالقيم الصحيحة التي تتوقعها الدالة الرئيسية.
تأكيد نجاح الاختبار
إذا كنت قد قمت بكل هذه التعديلات بشكل صحيح، ستحصل على نتيجة الاختبار التالية:
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
هذا يعني أن اختبار go_to_the_right_street
قد تم بنجاح.
الخاتمة
لقد ناقشنا في هذا المقال مشكلة شائعة تعني بـ "python – Asserting that a function that is mocked is called_once but running into ValueError: not enough values to unpack (expected 2, got 0)". من خلال فهم كيفية تزوير الدوال بشكل صحيح والتأكد من أن الاستدعاءات تعمل كما هو متوقع، يمكنك معالجة الأخطاء بسرعة وتحسين جودة البرمجيات.
من الطبيعي أن يواجه المبرمجون بعض التحديات أثناء كتابة اختبارات الوحدة، لكن الحلول موجودة دائمًا، والأهم هو التعلم من هذه التجارب. نأمل أن يكون هذا المقال قد قدم لك رؤى قيمة لمساعدتك في توفير اختبارات أكثر فعالية وجودة في مشاريعك المستقبلية.