Non c'è modo di farlo all'interno di un test di unità. È possibile se si interrompe testare il valore restituito e l'avviso in due test diversi.
Il gestore di errori di PHPUnit rileva gli errori e le notifiche PHP e li converte in eccezioni, che per definizione interrompe l'esecuzione del programma. La funzione che stai testando non ritorna mai. Tuttavia, è possibile disabilitare temporaneamente la conversione degli errori in eccezioni, anche in fase di runtime.
Questo è probabilmente più facile con un esempio, così, ecco quello che i due test dovrebbe essere simile:
public function testLoadFileTriggersErrorWhenFileNotFound()
{
$this->setExpectedException('PHPUnit_Framework_Error_Warning'); // Or whichever exception it is
$result = load_file('/some/non-existent/file');
}
public function testLoadFileRetunsFalseWhenFileNotFound()
{
PHPUnit_Framework_Error_Warning::$enabled = FALSE;
$result = load_file('/some/non-existent/file');
$this->assertFalse($result);
}
Questo ha anche il vantaggio di rendere i test più chiara, più pulito e di auto documentazione.
Ri: Commento: Questa è una grande domanda, e non avevo idea fino a quando ho eseguito un paio di test. Sembra come se fosse non ripristinare il valore predefinito/originale, almeno a partire da PHPUnit 3.3.17 (l'attuale versione stabile in questo momento).
Quindi, vorrei davvero modificare quanto sopra a guardare in questo modo:
public function testLoadFileRetunsFalseWhenFileNotFound()
{
$warningEnabledOrig = PHPUnit_Framework_Error_Warning::$enabled;
PHPUnit_Framework_Error_Warning::$enabled = false;
$result = load_file('/some/non-existent/file');
$this->assertFalse($result);
PHPUnit_Framework_Error_Warning::$enabled = $warningEnabledOrig;
}
Re: secondo commento:
Questo non è completamente vero. Sto guardando gestore degli errori di PHPUnit, e funziona come segue:
- Se si tratta di un
E_WARNING
, utilizzare PHPUnit_Framework_Error_Warning
come classe di eccezione.
- Se si tratta di un errore o di
E_NOTICE
E_STRICT
, utilizzare PHPUnit_Framework_Error_Notice
- Else, utilizzare
PHPUnit_Framework_Error
come la classe di eccezione.
Quindi, sì, errori del E_USER_*
non sono trasformati in * _Warning di PHPUnit o * classe _Notice, sono ancora trasformati in un PHPUnit_Framework_Error
un'eccezione generica.
ulteriori riflessioni
Mentre dipende esattamente da come si utilizza la funzione, probabilmente passare a un'eccezione reale, invece di innescare un errore, se si trattasse di me. Sì, questo cambierebbe il flusso logico del metodo e il codice che usa il metodo ... in questo momento l'esecuzione non si ferma quando non può leggere un file. Ma spetta a te decidere se il file richiesto non esistente è veramente comportamento eccezionale. Tendo ad usare le eccezioni molto più di errori/avvisi/notifiche, perché sono più facili da gestire, testare e lavorare nel flusso delle applicazioni. Solitamente riservo le comunicazioni per cose come le chiamate di metodo ammortizzate, ecc.
Grazie jason. Ti capita di sapere se il valore PHPUnit_Framework_Error_Warning :: $ è automaticamente ripristinato tra i test? O è necessario modificarlo manualmente al suo valore originale? – dellsala
Una nota su questa risposta, benché funzioni per errori generati da metodi e metodi php incorporati, non sembra funzionare per i tipi di errore generati dall'utente (E_USER_WARNING e E_USER_NOTICE) trigger_error. Sembra che PHPUnit non supporti l'attivazione di questi in fase di runtime (versione 3.3.17) – dellsala