Họ đang đo gì
Bạn có nhận ra test bị mock quá nhiều sẽ vẫn xanh khi code hỏng không.
Trả lời ngắn~30 giây
Mình mock những gì nằm ngoài tầm kiểm soát và những gì làm test chậm hoặc không xác định: API bên thứ ba, đồng hồ hệ thống, số ngẫu nhiên, gửi email. Mình KHÔNG mock database — chạy thật bằng container cho niềm tin cao hơn nhiều, vì phần lớn lỗi thật nằm trong truy vấn chứ không trong logic gọi truy vấn. Dấu hiệu mock quá tay là khi bạn refactor mà không đổi hành vi và mười test đỏ lên: test đang gắn với cách cài đặt chứ không với kết quả.
Giải thích sâu
Với API bên thứ ba, mock có một rủi ro riêng: nó ghi lại giả định của bạn về API đó tại thời điểm viết, và giả định đó lặng lẽ sai đi khi bên kia thay đổi. Test vẫn xanh, production vẫn hỏng. Cách giảm là contract test — chạy định kỳ với API thật để kiểm tra giả định vẫn đúng — hoặc dùng bản ghi lại phản hồi thật thay vì viết tay.
Về đồng hồ, đây là chỗ đáng đầu tư sớm: tiêm thời gian vào thay vì gọi Date.now() trực tiếp, để test được các trường hợp biên — hết hạn token, giao dịch qua nửa đêm, đổi múi giờ. Đây cũng là loại bug rất khó tái hiện trong production, nên có thể test được nó là lợi ích lớn hơn vẻ ngoài.
Câu hỏi tiếp theo họ sẽ hỏi
?Stub, mock, fake, spy khác nhau ra sao?
Stub trả về giá trị định sẵn. Mock còn kiểm tra nó ĐƯỢC GỌI như thế nào. Fake là bản cài đặt thật nhưng đơn giản hoá (một repository trong bộ nhớ). Spy bọc quanh vật thật để ghi lại lời gọi. Fake thường cho test dễ đọc nhất vì nó không ràng buộc vào chi tiết gọi hàm.
Trả lời thế này là mất điểm
- Mock chính lớp đang được test. Lúc đó test chứng minh mock hoạt động, không chứng minh gì về code.