Middle
Qu'est-ce que les mocks et les stubs ? En quoi diffèrent-ils ?
sobes.tech IA
Réponse de l'IA
Les mocks et stubs sont des types de doublures de test utilisés en test unitaire pour simuler le comportement des dépendances réelles de l'objet.
Stub :
- Fournit un comportement "fixe" pour un scénario de test.
- Répond aux appels de méthodes en renvoyant des valeurs prédéfinies.
- Ne vérifie pas l'interaction, son objectif est de fournir des données pour que l'objet testé continue.
<?php
// Exemple d'objet stub
class StubDatabase {
public function getUserById(int $id): ?array {
// Simulation de la valeur de retour pour un ID spécifique
if ($id === 1) {
return ['id' => 1, 'name' => 'Test User'];
}
return null;
}
}
Mock :
- Semblable au stub, mais avec une logique de vérification de l'interaction.
- Contient des attentes sur les méthodes qui doivent être appelées, combien de fois et avec quels arguments.
- Le test vérifie non seulement le résultat, mais aussi la bonne interaction avec le mock.
<?php
// Exemple d'objet mock
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\MockObject\MockObject;
class UserServiceTest extends TestCase {
public function testGetUserByIdCallsDatabase(): void {
$databaseMock = $this->createMock(Database::class);
$databaseMock->expects($this->once()) // Attente d'un appel
->method('getUserById')
->with(1) // Attente de l'argument 1
->willReturn(['id' => 1, 'name' => 'Test User']); // Valeur de retour attendue
$userService = new UserService($databaseMock);
$user = $userService->getUserById(1);
// Vérification du résultat et de l'interaction
$this->assertNotEmpty($user);
$this->assertEquals('Test User', $user['name']);
}
}
Tableau comparatif :
| Caractéristique | Stub | Mock |
|---|---|---|
| Objectif | Fournir des données pour le test | Vérifier interaction et données |
| Vérification | Ne vérifie pas l'interaction | Vérifie comment l'objet interagit |
| Logique de comportement | Retourne simplement des valeurs | Contient des attentes d'appels |
Qui fait assert? |
Objet ou client en test | Le mock lui-même (via attentes) |