Qual è la differenza tra stop e mock?
sobes.tech AI
Risposta dell'AI
stop — è una tecnica di isolamento del test delle dipendenze dirette (ad esempio, chiamate a API esterne, database) sostituendo gli oggetti reali con delle simulazioni di test. Viene usata per controllare il comportamento delle dipendenze esterne e garantire la riproducibilità dei test.
mock (derivato da "oggetto simulato") — è una varietà di simulacro di test che non solo sostituisce l'oggetto reale, ma permette anche di verificare come il codice testato interagisce con esso. Con i mock si può affermare (assert) sulle chiamate ai metodi, sui loro argomenti e sul numero di chiamate.
Quindi, stop è un concetto più generale che descrive l’isolamento, mentre mock è uno strumento concreto per raggiungerlo, aggiungendo la possibilità di verificare l’interazione.
Esempio con PHPUnit e Mockery:
<?php
use PHPUnit\Framework\TestCase;
use Mockery;
// Classe che utilizza una dipendenza esterna
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') {
// Logica di elaborazione utente attivo
return true;
}
return false;
}
}
// Esempio di utilizzo di mock per i test
class UserProcessorTest extends TestCase
{
public function testProcessUserDataWithActiveUser()
{
// Creiamo un mock per ApiClient
$apiClientMock = Mockery::mock(ApiClient::class);
// Impostiamo il comportamento atteso per il mock
// Si aspetta la chiamata al metodo fetchUserData con argomento 123
$apiClientMock->shouldReceive('fetchUserData')
->with(123)
->andReturn(['status' => 'active', 'data' => '...']) // Il mock restituisce questi dati
->once(); // Si aspetta che il metodo venga chiamato una sola volta
// Creiamo l’oggetto di test, passando il mock
$userProcessor = new UserProcessor($apiClientMock);
// Eseguiamo il metodo di test
$result = $userProcessor->processUserData(123);
// Verifichiamo il risultato
$this->assertTrue($result);
// Verifichiamo che tutte le aspettative del mock siano state soddisfatte
Mockery::close();
}
}
In questo esempio, ApiClient viene sostituito con un "mock". Abbiamo "finto" la chiamata reale all’API e configurato il mock per restituire determinati dati quando viene chiamato fetchUserData(123). Verifichiamo anche che questo metodo sia stato chiamato con gli argomenti corretti e una sola volta. Questa è la differenza principale: il mock permette di verificare l’interazione.