PHP e SimpleTest esecuzione tearDown() anche se c'è un errore di eccezione irreversibile
-
24-09-2019 - |
Domanda
Una ricerca produce un paio di domande sulla cattura di eccezioni mortali, ma questo è specifico per uso SimpleTest.(So che SimpleTest non è aggiornato, ma ottenere PHP-Unità di lavoro sulla mia configurazione è un'altra questione).
Sto cercando di ottenere il tearDown (), metodo di lavoro, anche quando c'è un errore di eccezione irreversibile, come creare alcuni test righe nel database durante l'installazione, e rimuoverli durante tear-down.Ma quando SimpleTest tratta di un errore di eccezione irreversibile, teardown() non è mai stato eseguito.
C'è un modo per ottenere tearDown() per eseguire nonostante un fatale exeception?
Soluzione
C'è un "register_shutdown_fuction" gancio che può essere utilizzato:
register_shutdown_function(array($this, 'shutdownHandler'));
In "shutdownHandler" si può scrivere:
error_get_last() && $this->tearDown();
Altri suggerimenti
Quando si verifica un Errore Irreversibile, PHP processo è terminato -- il che significa che non c'è modo di avere la stessa PHP processo eseguito in qualsiasi tipo di addionnal codice, in quanto non c'è più.
Questo significa che :
- probabilmente non ottenere molto di reporting
- altre prove, dopo quello che finisce in un Errore Fatale, non verrà eseguito
- Hai una prova che, in mancanza -- male.
Si dovrebbe risolvere il problema :un Errore Fatale, l'applicazione è male ;è bello che si rilevato con il test automatizzati, ovviamente-ma il passo successivo è quello di farlo andare via ;-)
Come non è possibile eseguire più di codice PHP in un processo che è morto, l'unica soluzione che vedo sarebbe quello di avviare un altro processo, per eseguire la pulizia del codice.
L'idea di base sarebbe :
- Avviare il test
- Utilizzare un'altra, totalmente distinti, uno script per eseguire le operazioni di pulizia
Naturalmente, questo significa che la pulizia sarà effettuata solo una volta, dopo che tutti i test sono stati eseguiti ;ma suppongo che è meglio di niente.
Ora, come si fa in modo automatico ?
La soluzione più semplice sarebbe probabilmente utilizzare una shell-script, che gestisce i comandi ;qualcosa di simile a questo, direi che :
#!/bin/sh
php /.../launch-tests.php
php /.../cleanup.php
E di eseguire i test con il lancio di shell-script.