Skip to main content

Perché usare i mock

Quando scrivi test, ci sono operazioni che non vuoi eseguire realmente: invio email, letture/scritture in cache, chiamate ad API esterne. Sostituire queste operazioni con “impostori che fingono di essere veri” si chiama mocking. Vantaggi dei mock:
  • Test veloci — non esegui servizi esterni od operazioni pesanti, quindi i test finiscono subito
  • Test stabili — non dipendi dallo stato dei servizi esterni, il risultato è sempre lo stesso
  • Test più mirati — verifichi una singola classe o metodo
Laravel fornisce helper pronti all’uso per mocking di eventi, job e facade. Internamente usa Mockery; li usi senza configurazione complessa.

Oggetti mock

Per fare il mock di un oggetto iniettato tramite il service container, registra un’istanza mock nel container. Il container userà l’istanza mock invece di crearne una reale.

Metodo mock()

Con il metodo mock() fornito dalla classe base dei test di Laravel scrivi lo stesso in modo più conciso.

Metodo partialMock()

Se vuoi mockare solo alcuni metodi di un oggetto, usa partialMock(). I metodi non mockati vengono eseguiti normalmente.

Metodo spy()

Uno spy è simile a un mock, ma verifica le interazioni dopo l’esecuzione del codice. Il mock imposta in anticipo “questo metodo dovrà essere chiamato”; lo spy verifica a posteriori “questo metodo è stato chiamato?”.

Mock delle facade

Le facade, diversamente dalle normali chiamate a metodi statici, possono essere mockate. Hai la stessa testabilità della dependency injection con una sintassi concisa. Considera ad esempio un controller che usa la cache.
Per mockare il metodo get della facade Cache usa expects().
Non mockare la facade Request. Passa invece gli input ai metodi di test HTTP come get o post. Analogamente, invece di mockare la facade Config, chiama Config::set() nel test.

Spy delle facade

Per monitorare una facade con uno spy, chiama il metodo spy() sulla facade corrispondente. Lo spy è utile quando vuoi verificare le interazioni dopo l’esecuzione del codice.

Manipolazione del tempo

Nei test che verificano logiche dipendenti dal tempo è utile poter cambiare l’orario restituito da now() o Carbon::now(). La classe base dei test feature di Laravel fornisce helper per manipolare il tempo.

travel() — spostare il tempo

Spostamento del tempo con closure

Passando una closure ai metodi di travel, il tempo viene fissato all’istante indicato durante l’esecuzione della closure e ripristinato alla fine.

freezeTime() — fermare il tempo

freezeTime() congela l’orario corrente. freezeSecond() lo congela all’inizio del secondo corrente.

Esempio pratico: lock su thread inattivi

La manipolazione del tempo aiuta a testare funzionalità come i thread di un forum che si bloccano dopo un certo periodo di inattività.
I metodi di manipolazione del tempo come travel() sono utilizzabili solo nei feature test (classi che estendono Tests\TestCase). Non funzionano nel TestCase base di PHPUnit.

Elenco dei metodi

Legati ai mock

Legati al tempo

Ultima modifica il 13 luglio 2026