Testing & Code Quality
Mocking & Test Doubles
Mocks, stubs, fakes, spies, and fixtures replace real collaborators so tests can control inputs, isolate behavior, avoid slow dependencies, and observe important interactions.
- A stub returns controlled data
- A fake has working simplified behavior
- A spy records interactions
- A mock encodes expectations
- Mock at system boundaries, not every function call
| Double | Purpose | Example |
|---|---|---|
| Stub | Return predefined value | fake API response |
| Fake | Simplified working implementation | in-memory repo |
| Spy | Record calls | was callback called? |
| Mock | Pre-programmed expectation | must call save once |
| Fixture | Reusable test data | sample user object |
function createFakeUserRepo() {
const users = new Map()
return {
async save(user) {
users.set(user.id, user)
},
async findById(id) {
return users.get(id) ?? null
},
}
}