البرمجة

اختبار وحدة: Mocking psycopg2 في Python Unittests

في البداية، يبدو أنك تحاول استخدام mock.patch لاختبار وحدة التحكم الخاصة بك في وحدة الربط مع قاعدة البيانات باستخدام مكتبة psycopg2 في لغة Python. لكن الخطأ الذي تواجهه يشير إلى أن هناك مشكلة في تعديل أو استبدال خصائص محددة.

لحل هذه المشكلة واستبدال psycopg2.connect و psycopg2.extensions.cursor.fetchall بقيمة مزيفة، يمكنك استخدام mock.patch بشكل صحيح. يجب أن يكون لديك ترتيب صحيح لوسائط الدالة المزيفة. يمكنك استخدامها كالتالي:

python
import unittest from unittest import mock from psycopg2 import extensions def super_cool_method(): con = psycopg2.connect(**connection_stuff) cur = con.cursor(cursor_factory=extensions.DictCursor) cur.execute("Super duper SQL query") rows = cur.fetchall() for row in rows: # do some data manipulation on row return rows class TestSuperCoolMethod(unittest.TestCase): @mock.patch("psycopg2.connect") def test_super_awesome_stuff(self, mock_connect): mock_cursor = mock_connect.return_value.cursor.return_value mock_cursor.fetchall.return_value = [("fake_data_1",), ("fake_data_2",)] testing = super_cool_method() self.assertEqual(testing, [("fake_data_1",), ("fake_data_2",)]) if __name__ == "__main__": unittest.main()

في هذا المثال، تم استخدام mock.patch لاستبدال psycopg2.connect بمكالمة دالة مزيفة (mock_connect). ثم تم استخدام mock_connect.return_value.cursor.return_value للوصول إلى متغير cur في دالة الأصل، وتم استبدال fetchall بقيمة مزيفة تحتوي على بيانات وهمية.

تأكد من ترتيب الوسائط بشكل صحيح وأنك تستخدم mock_connect.return_value.cursor.return_value بدلاً من mock.patch("psycopg2.extensions.cursor.fetchall").

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

بالطبع، دعوني أوسع في شرح بعض المفاهيم والتقنيات التي تم استخدامها في الكود المقدم:

mock.patch:

mock.patch هو جزء من مكتبة unittest.mock في Python ويستخدم لاستبدال الكائنات الحية بكائنات مزيفة خلال اختبارات الوحدة. يسمح ذلك بفحص سلوك الكود دون التأثير على البيئة الحية.

unittest.TestCase:

unittest.TestCase هو فئة أساسية في وحدات الاختبار في Python. يمكنك تحديد اختبارات الوحدة باستخدام الدوال التي تبدأ بكلمة “test” داخل فئة TestCase. في هذا السياق، تم استخدامها لتنظيم الاختبار الخاص بك.

mock_connect.return_value.cursor.return_value:

في هذا السياق، يتم استخدام mock_connect.return_value.cursor.return_value للوصول إلى كائن cursor الذي يتم إرجاعه من دالة cursor() التابعة لكائن mock_connect. ثم يتم الوصول إلى كائن fetchall لتحديد القيمة المُراد تزويدها كبيانات مزيفة.

assertEqual:

assertEqual هو أسلوب في unittest.TestCase يُستخدم للتحقق من أن قيمتين هي متساويتين. في هذا السياق، يتم استخدامه للتأكد من أن القيمة المُرجعة من super_cool_method() تتطابق مع القيمة المتوقعة.

هذه التقنيات والمفاهيم تُستخدم بشكل شائع في اختبارات الوحدة لضمان أداء وظيفة معينة في الكود بشكل صحيح دون الحاجة إلى الاتصال بالمكونات الحقيقية للبرنامج.

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

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

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر