Test doubles là các loại thay thế cho dependency thật trong test — Martin Fowler phân loại trong 'Mocks Aren't Stubs'.
- Dummy — placeholder được truyền vào nhưng không bao giờ dùng (null/empty object cho đủ tham số).
- Stub — trả về canned response, không verify cách gọi:
jest.fn().mockReturnValue(user)để cấp dữ liệu cho SUT. - Mock — được lập trình sẵn kỳ vọng về các lời gọi và verify chúng xảy ra:
expect(emailService.send).toHaveBeenCalledWith(email); test fail nếu lời gọi mong đợi không diễn ra. - Spy — bọc implementation thật và ghi lại lời gọi:
jest.spyOn()mặc định vẫn gọi method thật, override bằngmockImplementationkhi cần. - Fake — implementation đơn giản nhưng hoạt động: in-memory repository thay DB thật, fake email service lưu email vào array thay vì gửi.
Khi nào dùng: Stub khi chỉ cần kiểm soát dữ liệu trả về; Mock khi hành động quan trọng phải xảy ra (gửi email, emit event, charge payment); Spy khi muốn quan sát implementation thật; Fake khi cần nhiều tương tác thực tế với dependency (nhiều thao tác DB liên tiếp).
Over-mocking là code smell: test phải mock quá nhiều dependency (>3–4) thường báo hiệu vi phạm Single Responsibility — refactor code thay vì thêm mock; mock quá nhiều còn khiến test pass nhưng integration fail vì mock không phản ánh API thật.