Điểm mấu chốt: Jest phải biết khi nào async operation kết thúc — nếu không, test hoàn thành trước khi assertion chạy và pass một cách sai lệch.
- async/await hoặc return promise — cách chuẩn:
test('fetch', async () => { const data = await fetchData(); expect(data).toBe('ok') }), hoặcreturn fetchData().then(...). Quênawait/return→ Jest không chờ promise. .resolves/.rejects— matcher gọn cho promise:await expect(fetchData()).resolves.toBe('ok');await expect(fetchData()).rejects.toThrow('error'). Với case reject, thêmexpect.assertions(1)để bảo đảm assertion thực sự chạy.- done callback — cho API dạng callback: gọi
done()khi xong,done(error)khi lỗi; phải bọcexpecttrong try/catch rồidone(e)— nếu không, assertion fail sẽ làm test timeout thay vì báo lỗi rõ ràng. Không kết hợpdonevới async function (Jest báo lỗi). - Fake timers + async —
jest.useFakeTimers()chỉ điều khiển macro-task (setTimeout/setInterval), không tự flush promise; với code trộn timer và promise, dùng biến thể async:await jest.advanceTimersByTimeAsync(ms)hoặcawait jest.runAllTimersAsync().