Sobes.tech
Middle

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.