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
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.get della facade Cache usa expects().
Spy delle facade
Per monitorare una facade con uno spy, chiama il metodospy() 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 danow() 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.