رفتن به محتوای اصلی
برنامه‌سازی پیشرفته با پایتون درس‌نامهٔ آزاد
مفهوم پیشرفته ۸ دقیقه

موک و دابل‌های تست

unittest.mock، چه‌وقت موک بزنیم، دام موک‌زدنِ بیش‌ازحد و تستِ قرارداد.

from unittest.mock import patch

def send_receipt(gateway, phone, text):
    return gateway.send(phone, text)

def test_receipt_uses_gateway():
    calls = []
    fake = lambda phone, text: calls.append((phone, text)) or "ok"
    assert send_receipt(fake, "0912", "سلام") == "ok"
    assert calls == [("0912", "سلام")]

موک برای مرزهای کند/خارجی/تصادفی است (شبکه، ساعت، درگاه پرداخت) — نه برای منطقِ خودت. دام بزرگ: موک‌زدنِ آن‌قدر زیاد که تست فقط «پیاده‌سازیِ فعلی» را آینه کند و هر بازآراییِ سالم را قرمز کند. قانون: رفتارِ قابل‌مشاهده را assert کن، نه ترتیبِ فراخوانیِ داخلی را — مگر این‌که خودِ فراخوانی، قرارداد باشد (مثل ارسال پیامک).

برداشت نادرست رایج

اشتباه رایج

کدِ خوب تست‌شده یعنی همه‌چیز موک شده.

تصحیح

موک بدهی است: هر موک یک قراردادِ دستی است که با تغییر واقعیت می‌شکند. کمترین موکی که مرز را کنترل کند، بهترین است.

پیش‌نیازها

مطالب مرتبط

از همین بخش و با برچسب‌های مشترک

این مطلب را خواندید؟ آن را علامت بزنید تا پیشرفت شما روی همین دستگاه ذخیره شود.

وضعیت پیشرفت برای موک و دابل‌های تست