Test isolation nghĩa là mỗi test chạy độc lập: không phụ thuộc thứ tự, không dùng chung state với test khác.
Vì sao quan trọng: test phụ thuộc thứ tự chính là flaky (chạy riêng thì pass, chạy chung thì fail), và shared state khiến debug rất mệt vì test fail có thể do một test khác gây ra.
Các kỹ thuật:
- Module mock: jest.resetModules() trong beforeEach để reset module registry — cần khi module bị mock có side effect.
- Reset môi trường: jest.clearAllMocks() xoá số lần gọi, jest.resetAllMocks() xoá luôn implementation, jest.restoreAllMocks() khôi phục các spy về bản gốc.
- Database: rollback transaction sau mỗi test (với Prisma là prisma.$transaction rồi rollback trong afterEach), hoặc truncate bảng.
- Server theo scope test: mỗi test suite dựng instance Express riêng thay vì dùng chung một app global.
Mẹo chẩn đoán: chạy --runInBand để test đi tuần tự. Nếu tuần tự thì xanh mà chạy song song thì đỏ, gần như chắc chắn là lỗi shared state.
Jest vốn đã cô lập ở mức file — mỗi file chạy trong một worker Node.js riêng. Nên phần phải tự lo là cô lập bên trong một file.
Lưu ý: sửa biến global trong test mà quên cleanup là rò thẳng sang test kế tiếp.