# Di Mockable Services

> Design injectable, mockable services (interfaces + composition root)

- Skill: `majiayu000/di-mockable-services` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/di-mockable-services`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/di-mockable-services/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/di-mockable-services

---

## What I do

Je standardise la **DI** (injection de dépendances) et la conception **mockable**.

## Core rules
- Écrire le contrat d'abord : `IUserApi`, `UserRepository`, etc.
- Les hooks/use-cases dépendent des interfaces.
- Les implémentations concrètes vivent dans `infra/`.
- Le **seul** endroit qui instancie l'infra est le `composition root`.

## Example (frontend service)

```ts
export interface IUserApi {
  getById(id: string): Promise<UserDTO>;
}

export class UserApi implements IUserApi {
  constructor(private readonly http: HttpClient) {}
  getById(id: string) { return this.http.get(`/users/${id}`); }
}

export class FakeUserApi implements IUserApi {
  async getById(id: string) { return { id, name: 'Test' }; }
}
```

## Testing guidance
- En test, remplacer via le container : `container.userApi = new FakeUserApi()`.
- Éviter les mocks globaux non typés.

