Quelle est la différence entre stop et mock?
sobes.tech IA
Réponse de l'IA
stop — c’est une technique d’isolation du test des dépendances directes (par exemple, appels à des API externes, bases de données) en remplaçant les objets réels par des simulacres de test. Elle est utilisée pour contrôler le comportement des dépendances externes et assurer la reproductibilité des tests.
mock (dérivé de "objet simulé") — c’est une variété de simulacre de test qui ne se contente pas de remplacer l’objet réel, mais permet aussi de vérifier comment le code testé interagit avec lui. Avec les mocks, on peut affirmer (assert) sur les appels de méthodes, leurs arguments et le nombre d’appels.
Ainsi, stop est un concept plus général décrivant l’isolation, et mock est un outil concret pour y parvenir, ajoutant la possibilité de vérifier l’interaction.
Exemple avec PHPUnit et Mockery :
<?php
use PHPUnit\Framework\TestCase;
use Mockery;
// Classe utilisant une dépendance externe
class UserProcessor
{
private $apiClient;
public function __construct(ApiClient $apiClient)
{
$this->apiClient = $apiClient;
}
public function processUserData(int $userId): bool
{
$data = $this->apiClient->fetchUserData($userId);
if ($data && $data['status'] === 'active') {
// Logique de traitement d’un utilisateur actif
return true;
}
return false;
}
}
// Exemple d’utilisation d’un mock pour les tests
class UserProcessorTest extends TestCase
{
public function testProcessUserDataWithActiveUser()
{
// Création d’un mock pour ApiClient
$apiClientMock = Mockery::mock(ApiClient::class);
// Définir le comportement attendu pour le mock
// Attendre l’appel de la méthode fetchUserData avec l’argument 123
$apiClientMock->shouldReceive('fetchUserData')
->with(123)
->andReturn(['status' => 'active', 'data' => '...']) // Le mock retourne ces données
->once(); // On attend que la méthode soit appelée une seule fois
// Créer l’objet testé en lui passant le mock
$userProcessor = new UserProcessor($apiClientMock);
// Exécuter la méthode testée
$result = $userProcessor->processUserData(123);
// Vérifier le résultat
$this->assertTrue($result);
// Vérifier que toutes les attentes du mock ont été respectées
Mockery::close();
}
}
Dans cet exemple, ApiClient est remplacé par un "mock". Nous avons "factice" l’appel réel à l’API et configuré le mock pour retourner certaines données lors de l’appel à fetchUserData(123). Nous vérifions aussi que cette méthode a été appelée avec les bons arguments et une seule fois. C’est là la différence essentielle : le mock permet de vérifier l’interaction.