تكرار السؤال: …
الإجابة المختصرة
استخدم IsolatedAsyncioTestCase في unittest، أو إضافة مثل pytest-asyncio أو anyio في pytest، حتى يُنفذ الاختبار داخل event loop وتنتظر الـ coroutine فعليًا.
الشرح
استدعاء coroutine بدون await داخل اختبار عادي ينشئ الـ coroutine فقط ولا ينفذها، فينجح الاختبار زورًا. اعزل الشبكة والوقت (مثلًا بـ AsyncMock)، وتأكد من اختبار مسارات الإلغاء والمهلات والأخطاء، وأن الاختبار لا يترك مهام خلفية معلقة. ويساعد تفعيل debug mode في asyncio على كشف الـ coroutines غير المنتظرة.
مثال بالكود
import pytest
from unittest.mock import AsyncMock
@pytest.mark.asyncio
async def test_fetch_profile_uses_client():
client = AsyncMock()
client.get.return_value = {"name": "Mona"}
profile = await fetch_profile(client, user_id=1)
assert profile.name == "Mona"
client.get.assert_awaited_once_with("/users/1")أخطاء شائعة
- كتابة def test_x(): fetch() دون await فيمر الاختبار دون تنفيذ شيء.
- استخدام Mock عادي بدل AsyncMock لدالة async.