تكرار السؤال: …
الإجابة المختصرة
مرر الساعة ومصدر العشوائية كاعتماديات قابلة للاستبدال بدل استدعاء datetime.now() أو random مباشرة داخل منطق الـ domain، ثم ثبّتهما في الاختبار.
الشرح
الدوال التي تقرأ الوقت الحالي ضمنيًا تنتج نتائج مختلفة حسب لحظة التشغيل والمنطقة الزمنية للجهاز. حقن clock يجعل الاختبار حتميًا ويسمح بمحاكاة نهاية الشهر وتغيير التوقيت الصيفي. ثبّت الـ seed عندما تحتاج تكرار النتائج، أو مرر random.Random(seed) كمعامل. ويمكن استخدام مكتبات مثل time-machine أو freezegun لتجميد الوقت في الكود القديم.
مثال بالكود
from datetime import datetime, timezone
from typing import Callable
def is_expired(expires_at: datetime,
now: Callable[[], datetime] = lambda: datetime.now(timezone.utc)) -> bool:
return now() >= expires_at
def test_is_expired():
fixed = datetime(2026, 1, 1, tzinfo=timezone.utc)
assert is_expired(fixed, now=lambda: fixed)أخطاء شائعة
- اختبارات تفشل فقط عند تشغيلها قرب منتصف الليل أو في منطقة زمنية مختلفة.
- الاعتماد على time.sleep في الاختبارات لانتظار حدوث شيء.