في عالم برمجة Python، يعد `unittest.mock.patch` أداة قوية لاختبار الشيفرات بشكل فعّال. يسمح لك هذا الأسلوب بتغيير سلوك الدوال أو الطرق في الوقت الفعلي، وهو أداة قيمة في عملية اختبار الوحدات.
تُظهر الشيفرة التي قدمتها استخدام `patch.object` لتبديل طريقة (method) في الفئة (class) A بدالًا من استدعاء الطريقة الأصلية. الفائدة الرئيسية من هذا هي إمكانية تحكم أفضل في السلوك المتوقع خلال اختبارات الوحدات.
-
تحويل مصفوفة PHP إلى JSON بتنسيق مخصص20/02/2024
-
توسيط عنوان الـ ActionBar في Android Studio07/04/2024
ومع ذلك، يبدو أنك تواجه مشكلة في تعريف الطريقة التي تستخدم للتحقق (`assert_called_with`). الخطأ الذي واجهته يشير إلى أنه تم استدعاء `method2` بعدما تم توقعها بمتغير واحد (`’string’`) ولكن تم استدعاؤها بمتغير واحد آخر. يمكننا تصحيح هذا عن طريق ضبط توقعات الاستدعاء.
لحل هذا الخطأ، يجب أن نتأكد من أن `method2` تأخذ معاملًا إضافيًا، أيضًا يجب علينا استخدام `patch` بشكل صحيح. يمكننا تعديل الشيفرة كما يلي:
pythonfrom unittest.mock import patch
class A(object):
def method(self, string):
print(self, "method", string)
def method2(self, string):
print(self, "method2", string)
with patch.object(A, 'method', side_effect=method2):
a = A()
a.method("string")
a.method.assert_called_with(a, "string")
هنا قمنا بتعديل المرفق (`assert_called_with(a, “string”)`) ليشمل الكائن `a` كمتغير ذاتي الحالة (self)، لضمان تطابق المتوقع عند استدعاء الطريقة.
في النهاية، يعد استخدام `unittest.mock.patch` أداة فعّالة في عملية اختبار الوحدات للتحكم في سلوك الطرق والدوال، ويمكن أن يكون لديك استفسارات أخرى حول كيفية تحقيق أهداف اختبارك باستخدام هذه الأداة.
المزيد من المعلومات
في عالم برمجة Python، تعد mock.patch
أحد أدوات الاختبار المهمة التي تمكن المطورين من استبدال وحدات البرنامج (مثل الدوال أو الأساليب) بأوهام (mocks) لغرض الاختبار. تستخدم هذه الأداة لتغيير سلوك البرنامج المستبدلة بشيء آخر يحاكي السلوك المطلوب.
في الكود الذي قدمته، تحاول استخدام patch.object
لاستبدال الدالة method
في فئة A
بدالة method2
أثناء الاختبار. الهدف من هذا الاستبدال هو ضمان أن الدالة المستبدلة تعمل كما هو متوقع في سياق الاختبار.
لكن، يظهر خطأ TypeError في الرمز، حيث يشير إلى أن دالة method2
تتوقع وجود معامل إضافي (positional argument) بينما تم استدعاءها في سياق الاختبار بشكل خاطئ.
يبدو أن المشكلة تكمن في الاختبار نفسه، حيث يتم استدعاء a.method("string")
ثم يحاول الاختبار التحقق مما إذا كانت a.method
قد تم استدعاؤها بالطريقة الصحيحة باستخدام assert_called_with("string")
. ومع ذلك، تبدو أن method2
ليست معدة للتعامل مع معامل إضافي.
لتجاوز هذه المشكلة، يمكنك تعديل دالة method2
لتقبل المعاملات الإضافية بالتالي:
pythondef method2(self, string, *args, **kwargs):
print(self, "method2", string)
بعد هذا التعديل، يجب أن يعمل الاختبار بشكل صحيح، وذلك لأن method2
الآن قادرة على التعامل مع أي عدد من المعاملات. تأكد من تحديث الدالة المستبدلة في الاختبار بناءً على هذا التعديل.
تأكد من أن هناك تواصل سلس بين الاختبار والدوال المستبدلة لضمان أن السياق التشغيلي للاختبار يتماشى مع توقعات الدوال المستبدلة.