تكرار السؤال: …
الإجابة المختصرة
طبّق patch على الاسم في المكان الذي يستخدمه الكود تحت الاختبار، لا المكان الذي عُرّف فيه، واستخدم autospec حتى يفشل الـ mock إذا استُدعي بتوقيع خاطئ.
الشرح
إذا كتب الموديول app.billing السطر from app.gateway import charge، فيجب أن تطبق patch على "app.billing.charge" لأن الاسم نُسخ إلى نطاقه. الـ mocks مفيدة للاعتماديات الخارجية غير الحتمية (الشبكة، الوقت، خدمات الدفع)، لكن الإفراط فيها يجعل الاختبار مرتبطًا بتفاصيل التنفيذ وينكسر عند كل refactor. أحيانًا يكون fake بسيط مكتوب يدويًا أوضح وأكثر ثباتًا.
مثال بالكود
from unittest.mock import patch
# app/billing.py يحتوي: from app.gateway import charge
@patch("app.billing.charge", autospec=True)
def test_checkout_charges_total(mock_charge):
checkout(Order(total=50))
mock_charge.assert_called_once_with(amount=50, currency="EGP")أخطاء شائعة
- تطبيق patch على "app.gateway.charge" بينما الكود يستخدم نسخة مستوردة فلا يتغير شيء.
- استخدام MagicMock بدون autospec فيقبل أي استدعاء حتى بأخطاء إملائية.