Họ đang đo gì
Bạn có biết fake timer và tiêm đồng hồ không — hai công cụ biến một loại test không đáng tin thành đáng tin.
Trả lời ngắn~30 giây
Ba nguyên tắc. Một: đừng dùng thời gian thật — dùng fake timer để tua đồng hồ (vi.advanceTimersByTime), nên một test cho debounce 5 phút chạy trong một mili giây. Hai: đừng gọi Date.now() trực tiếp trong code, hãy tiêm một clock vào để test đặt được thời điểm. Ba: chờ theo ĐIỀU KIỆN chứ không theo thời lượng — waitFor cho tới khi trạng thái mong đợi xuất hiện, có thời hạn, thay vì sleep(500).
Giải thích sâu
Việc tiêm đồng hồ mở ra những test mà nếu không có nó thì gần như không viết được: token hết hạn đúng giây thứ 3600, giao dịch rơi vào lúc đổi ngày, lịch chạy qua mốc đổi giờ mùa. Những trường hợp này rất khó tái hiện trong production và cũng chính là nơi bug hay nằm — nên khả năng test được chúng đáng giá hơn nhiều so với công sức thêm một tham số.
Với code bất đồng bộ thật, cái bẫy phổ biến nhất là test kết thúc TRƯỚC khi promise resolve, nên nó xanh mà chẳng kiểm chứng gì. Dấu hiệu: một assertion sai cố ý mà test vẫn xanh. Vì vậy mỗi khi viết test async, mình luôn thử làm nó đỏ một lần — nếu không đỏ được thì nó chưa từng chạy assertion đó.
Câu hỏi tiếp theo họ sẽ hỏi
?Test retry với backoff thì sao?
Fake timer là bắt buộc, nếu không test phải chờ thật vài chục giây. Đồng thời phải kiểm được cả SỐ lần thử và KHOẢNG CÁCH giữa chúng — chỉ assert kết quả cuối cùng thì một vòng retry hỏng vẫn cho kết quả đúng.
Trả lời thế này là mất điểm
await sleep(100)rồi assert. Nó xanh trên máy bạn và đỏ ngẫu nhiên trên CI, và người ta sẽ sửa bằng cách tăng lên 500.