في مقالنا اليوم، سنستعرض كيفية استخدام mock.patch
في بيئة البرمجة بلغة Python للتلاعب بالمولّدات (generators) خلال اختبارات الوحدة (unit tests). قد واجهت تحديًا في تنفيذ هذا الأمر، وسأقدم لك توجيهات حول كيفية تحقيق هذا الهدف بنجاح.
في البداية، يظهر أن لديك مولّدًا يعيد أزواجًا من القيم، وتريد استبدال هذا المولّد بقيم ثابتة أثناء اختبارات الوحدة. لتحقيق ذلك باستخدام mock.patch
، يجب عليك التركيز على التصحيحات اللازمة في الشيفرة الخاصة بك.
أولًا وقبل كل شيء، دعونا نلقي نظرة على الشيفرة التي كتبتها للاختبار:
pythonimport 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
بدلاً من ذلك. سيكون لديك شيفرة الاختبار بشكل صحيح كما يلي:
pythondef 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__
لتحديد قيم العناصر التي سيُرجى بها المولّد.
إليك الشيفرة بالكامل مع التصحيحات:
pythonimport 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
.
pythonwith mock.patch('__main__.f') as mock_f:
يجب تحديثه إلى:
pythonwith mock.patch('__main__.call_f') as mock_call_f:
بعد ذلك، يمكنك استخدام mock_call_f.return_value
لتعيين القيمة المزيفة للدالة المستدعاة داخل الوحدة الرئيسية. هناك أيضًا خطأ في الطريقة التي قمت بها في تعيين القيمة المستعادة، حيث يجب عليك استخدام side_effect
بدلاً من return_value
. قم بتصحيح هذا الجزء كما يلي:
pythonmock_call_f.side_effect = lambda: dict(items)
أخيرًا، بعد تصحيح الأخطاء أعلاه، يجب أن تتمكن من تشغيل اختبارك بنجاح دون الأخطاء التي واجهتها. لتوضيح، إليك نسخة معدلة من كود الاختبار:
pythonimport 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()
أتمنى أن يكون ذلك مفيداً ويحل المشكلة التي واجهتها في اختبار الرمز.