البرمجة

استبدال الأساليب في Python باستخدام mock.patch

في عالم برمجة Python، يعد `unittest.mock.patch` أداة قوية لاختبار الشيفرات بشكل فعّال. يسمح لك هذا الأسلوب بتغيير سلوك الدوال أو الطرق في الوقت الفعلي، وهو أداة قيمة في عملية اختبار الوحدات.

تُظهر الشيفرة التي قدمتها استخدام `patch.object` لتبديل طريقة (method) في الفئة (class) A بدالًا من استدعاء الطريقة الأصلية. الفائدة الرئيسية من هذا هي إمكانية تحكم أفضل في السلوك المتوقع خلال اختبارات الوحدات.

ومع ذلك، يبدو أنك تواجه مشكلة في تعريف الطريقة التي تستخدم للتحقق (`assert_called_with`). الخطأ الذي واجهته يشير إلى أنه تم استدعاء `method2` بعدما تم توقعها بمتغير واحد (`’string’`) ولكن تم استدعاؤها بمتغير واحد آخر. يمكننا تصحيح هذا عن طريق ضبط توقعات الاستدعاء.

لحل هذا الخطأ، يجب أن نتأكد من أن `method2` تأخذ معاملًا إضافيًا، أيضًا يجب علينا استخدام `patch` بشكل صحيح. يمكننا تعديل الشيفرة كما يلي:

python
from 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 لتقبل المعاملات الإضافية بالتالي:

python
def method2(self, string, *args, **kwargs): print(self, "method2", string)

بعد هذا التعديل، يجب أن يعمل الاختبار بشكل صحيح، وذلك لأن method2 الآن قادرة على التعامل مع أي عدد من المعاملات. تأكد من تحديث الدالة المستبدلة في الاختبار بناءً على هذا التعديل.

تأكد من أن هناك تواصل سلس بين الاختبار والدوال المستبدلة لضمان أن السياق التشغيلي للاختبار يتماشى مع توقعات الدوال المستبدلة.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!