2010-11-11 15 views
6

Ho una serie di test e voglio verificare che le mie classi generino eccezioni al momento giusto. Nell'esempio, la mia classe utilizza il metodo magico __get(), quindi ho bisogno di testare che viene generata un'eccezione quando una proprietà non valida viene recuperata:PHPUnit non rileva le eccezioni previste

function testExceptionThrownWhenGettingInvalidProperty() { 
    $obj = new MyClass(); 
    $this->setExpectedException("Property qwerty does not exist"); 
    $qwerty = $obj->qwerty; 
} 

La classe genera un errore come dovrebbe, ma invece di solo ottenendo un passaggio, l'eccezione non viene catturata!

There was 1 error: 

1) QueryTest::testExceptionThrownWhenGettingInvalidProperty 
Exception: Property qwerty does not exist 

usavo SimpleTest prima, e $this->expectException(new Exception("Property qwerty does not exist")); funzionato bene. So che ci sono altri metodi (@ unexpectedException e try-catch), ma questo dovrebbe funzionare e sembra molto più pulito. Qualche idea su come posso farlo funzionare?

risposta

13

Non è cercando il testo l'eccezione, che sta cercando il nome della classe di eccezione ... Docs

$this->setExpectedException('Exception'); 

E 'molto utile quando si utilizza SPL Exceptions, o classi di eccezioni personalizzate .. .

+0

Grazie! L'ho completamente trascurato perché ero abituato al modo SimpleTest di farlo. Sai se esiste un modo semplice per testare il testo? –

+0

@Nathan, @ircmaxell: vedere la mia risposta, c'è un modo migliore per farlo, incluso il test per il testo. – ryeguy

+0

@ircmaxell: non sono d'accordo con il messaggio, non importa. Non vedi linguaggi o framework ben progettati che creano una nuova eccezione per ogni nuovo errore che si apre. Sarebbe solo troppo lavoro. – ryeguy

13

aggiunta alla risposta di ircmaxell, c'è in realtà un modo più semplice per farlo:

/** 
* @expectedException MyExceptionClass 
* @expectedExceptionMessage Array too small 
*/ 
public function testSomething() 
{ 
} 

Il @expectedException il nome classe dell'eccezione da prevedere e @expectedExceptionMessage è una sottostringa del messaggio di eccezione da prevedere (è corretto, non è necessario avere l'intero messaggio).

Se si preferisce non utilizzare le annotazioni di docblock, entrambi sono effettivamente disponibili come metodi sul caso di test.

+4

+1 ... Non ero a conoscenza del '@expectedExceptionMessage 'elemento docblock ... Impara qualcosa di nuovo ogni giorno ... – ircmaxell

+0

@ircmaxell: Sì, l'ho appena scoperto un po '. Non c'è menzione da nessuna parte tranne che sotto l'appendice "Annotazioni". Anche allora, non ci sono documenti su di esso, solo elenca il suo nome. – ryeguy

+0

molto bello - grazie! – jmadsen

Problemi correlati