Mọi nguồn không xác định phải được đẩy ra biên rồi thay bằng giá trị cố định trong test.
Ngẫu nhiên và UUID: đừng gọi trực tiếp trong hàm nghiệp vụ; nhận qua tham số hoặc mock module sinh id.
ts
vi.mock('./id', () => ({ newId: () => 'order-0001' }))
// hoặc: createOrder(input, { newId: () => 'order-0001' })Network: chặn ở tầng HTTP thay vì mock hàm gọi API, để code parse/xử lý lỗi vẫn chạy thật.
ts
server.use(http.get('/api/orders/:id', () => HttpResponse.json({ id: '1', amount: 500 })))Các điểm không xác định khác cũng phải xử lý, nếu không sẽ thành test lúc xanh lúc đỏ:
- Thứ tự phần tử: DB không đảm bảo thứ tự khi không có
ORDER BY→ assert theo tập hợp hoặc sort trước khi so sánh. - Số dấu phẩy động: dùng
toBeCloseTothaytoBe. - Locale:
toLocaleStringkhác nhau giữa máy dev và CI → cố định locale.
Mục tiêu: chạy test 100 lần trên 3 máy khác nhau phải ra cùng kết quả. Test không xác định sẽ nhanh chóng bị cả nhóm bỏ qua khi nó đỏ.