البرمجة

تصحيح أخطاء اختبار وحدة باستخدام mock.patch في Python

في مقالنا اليوم، سنستعرض كيفية استخدام mock.patch في بيئة البرمجة بلغة Python للتلاعب بالمولّدات (generators) خلال اختبارات الوحدة (unit tests). قد واجهت تحديًا في تنفيذ هذا الأمر، وسأقدم لك توجيهات حول كيفية تحقيق هذا الهدف بنجاح.

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

أولًا وقبل كل شيء، دعونا نلقي نظرة على الشيفرة التي كتبتها للاختبار:

python
import mock items = [(1, 'a'), (2, 'a'), (3, 'a')] def call_f(): my_dict = dict(f()) print(my_dict[1]) def test_call_f(): with mock.patch('__main__.f') as mock_f: mock_f.iter.return_value = items call_f()

هنا، يوجد خطأ في استخدام mock_f.iter.return_value، حيث أنه يتم الإشارة إلى خاصية iter التي غير معرفة في المولّد. يجب عليك استخدام side_effect بدلاً من ذلك. سيكون لديك شيفرة الاختبار بشكل صحيح كما يلي:

python
def test_call_f(): with mock.patch('__main__.f') as mock_f: mock_f.return_value = mock.MagicMock() mock_f.return_value.__iter__.return_value = iter(items) call_f()

تعتمد هذه التصحيحات على استخدام mock.MagicMock() لإنشاء كائن بديل للمولّد، واستخدام __iter__ لتحديد قيم العناصر التي سيُرجى بها المولّد.

إليك الشيفرة بالكامل مع التصحيحات:

python
import mock items = [(1, 'a'), (2, 'a'), (3, 'a')] def call_f(): my_dict = dict(f()) print(my_dict[1]) def test_call_f(): with mock.patch('__main__.f') as mock_f: mock_f.return_value = mock.MagicMock() mock_f.return_value.__iter__.return_value = iter(items) call_f()

باستخدام هذه التصحيحات، يجب أن يتم تنفيذ اختبار الوحدة بنجاح وبدون أي أخطاء. يرجى تجربة هذا الحل وإعلامي إذا كنت بحاجة إلى أي مساعدة إضافية أو توضيح.

المزيد من المعلومات

(باللغة العربية)

عند فحص الشيفرة التي قدمتها، يبدو أن هناك خطأ في كيفية استخدامك لوحدة الاختبار المزيفة (mock). يمكنني شرح الأخطاء المحتملة وتقديم إرشادات حول كيفية تصحيحها.

أولاً وقبل كل شيء، يجب عليك التأكد من تصحيح الوحدة التي تريد اختبارها. في حالتك، يجب أن يكون الركيزة المراد اختبارها هي الدالة call_f وليس الدالة المولدة f. لذلك، يجب أن تبدأ بتعديل خط الركيزة ليشير إلى __main__.call_f بدلاً من __main__.f.

python
with mock.patch('__main__.f') as mock_f:

يجب تحديثه إلى:

python
with mock.patch('__main__.call_f') as mock_call_f:

بعد ذلك، يمكنك استخدام mock_call_f.return_value لتعيين القيمة المزيفة للدالة المستدعاة داخل الوحدة الرئيسية. هناك أيضًا خطأ في الطريقة التي قمت بها في تعيين القيمة المستعادة، حيث يجب عليك استخدام side_effect بدلاً من return_value. قم بتصحيح هذا الجزء كما يلي:

python
mock_call_f.side_effect = lambda: dict(items)

أخيرًا، بعد تصحيح الأخطاء أعلاه، يجب أن تتمكن من تشغيل اختبارك بنجاح دون الأخطاء التي واجهتها. لتوضيح، إليك نسخة معدلة من كود الاختبار:

python
import mock def test_call_f(): items = [(1, 'a'), (2, 'a'), (3, 'a')] with mock.patch('__main__.call_f') as mock_call_f: mock_call_f.side_effect = lambda: dict(items) call_f() test_call_f()

أتمنى أن يكون ذلك مفيداً ويحل المشكلة التي واجهتها في اختبار الرمز.

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