Les mocks

Partie théorique
Qu'est-ce qu'un mock ?
Dans le domaine du développement logiciel, un mock est une simulation d'un objet réel utilisée pour tester le comportement de certains composants du logiciel.
Les mocks sont particulièrement utiles dans les tests unitaires, où ils peuvent être utilisés pour simuler le comportement d'objets dépendants afin de tester le comportement de l'objet cible dans des conditions contrôlées.
Les mocks sont généralement utilisés lorsque l'objet réel est imprévisible ou difficile à reproduire dans un environnement de test (par exemple, une base de données ou un service Web).
PHPUnit fournit un moyen facile de créer des mocks d'objets en PHP.
Exemple pratique
Supposons que nous avons une classe Fighter qui dépend d'une autre classe Arena.
Nous voulons tester la méthode
fightde la classeFighter, mais sans avoir à créer une véritable instance deArena.
class Fighter {
private $arena;
public function __construct(Arena $arena) {
$this->arena = $arena;
}
public function fight() {
if ($this->arena->isOpen()) {
return "Le combat commence !";
} else {
return "L'arène est fermée.";
}
}
}
Nous pouvons créer un mock de Arena pour tester la méthode fight de Fighter :
public function testFight() {
// Création d'un mock pour la classe Arena
$arena = $this->createMock(Arena::class);
// Configuration du mock pour retourner true lorsque la méthode isOpen est appelée
$arena->method('isOpen')
->willReturn(true);
$fighter = new Fighter($arena);
$this->assertEquals("Le combat commence !", $fighter->fight());
}
Dans cet exemple :
- Nous créons un mock de
Arenaqui retourne toujourstruelorsque la méthodeisOpenest appelée. - Nous utilisons ensuite ce mock pour tester la méthode
fightdeFighter.
📌 Pourquoi la classe Arena n'est pas implémentée ?
Lorsque vous créez un mock d'un objet (ici un objet Arena), vous n'avez pas besoin de la véritable implémentation de cet objet.
En fait, c'est l'un des principaux avantages de l'utilisation des mocks : vous pouvez tester le comportement d'un objet (ici un objet
Fighter) indépendamment de ses dépendances (ici un objetArena).
Lorsque vous créez un mock de l'objet Arena avec la ligne $arena = $this->createMock(Arena::class);,
vous créez un faux objet Arena qui se comporte exactement comme vous le définissez dans votre test.
Dans cet exemple, vous définissez que la méthode
isOpende l'objetArenamocké retourne toujourstrue.
Cela vous permet de contrôler précisément le comportement de l'objet Arena dans le cadre de votre test,
sans avoir à vous soucier de la véritable implémentation de la classe Arena.