Vì test đã mock đúng cái phần có bug. Mock thay thành phần thật bằng thứ bạn tự định nghĩa — nên nó chỉ kiểm chứng được rằng code gọi đúng thứ bạn tưởng tượng, không kiểm chứng thứ đó có tồn tại và hoạt động như vậy hay không.
Các kiểu hỏng cụ thể:
- Mock lệch với thật. API đổi tên trường
total_pricethànhamount, mock vẫn trảtotal_price→ test xanh, productionundefined. - Test dính implementation. Assert kiểu
expect(repo.save).toHaveBeenCalledWith(...)khiến mọi lần refactor nội bộ (dù hành vi không đổi) đều làm test đỏ. Test trở thành lực cản refactor thay vì lưới an toàn. - Mock chồng mock. Khi phải mock 6 thứ mới chạy được một hàm, đó là tín hiệu thiết kế: hàm đang ôm quá nhiều phụ thuộc, nên tách phần logic thuần ra.
Cách dùng mock hợp lý:
- Mock ranh giới ngoài hệ thống: HTTP bên thứ ba, gửi email, gửi SMS, thanh toán, đồng hồ.
- Không mock module nội bộ của chính mình nếu chạy thật được.
- Với API ngoài, ưu tiên chặn ở tầng mạng (vd MSW) thay vì mock hàm — như vậy vẫn chạy qua code gọi API thật.
- Có contract test hoặc một test chạy thật định kỳ để phát hiện mock đã lệch.