في البداية، يبدو أنك تحاول استخدام mock.patch
لاختبار وحدة التحكم الخاصة بك في وحدة الربط مع قاعدة البيانات باستخدام مكتبة psycopg2
في لغة Python. لكن الخطأ الذي تواجهه يشير إلى أن هناك مشكلة في تعديل أو استبدال خصائص محددة.
لحل هذه المشكلة واستبدال psycopg2.connect
و psycopg2.extensions.cursor.fetchall
بقيمة مزيفة، يمكنك استخدام mock.patch
بشكل صحيح. يجب أن يكون لديك ترتيب صحيح لوسائط الدالة المزيفة. يمكنك استخدامها كالتالي:
pythonimport 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()
تتطابق مع القيمة المتوقعة.
هذه التقنيات والمفاهيم تُستخدم بشكل شائع في اختبارات الوحدة لضمان أداء وظيفة معينة في الكود بشكل صحيح دون الحاجة إلى الاتصال بالمكونات الحقيقية للبرنامج.