2011-02-19 12 views
16

Sto scrivendo casi di test ed ecco una domanda che ho.Come catturare PHP Warning in PHPUnit

Quindi dire sto testando una semplice funzione someClass::loadValue($value)

Il banco di prova normale è facile, ma assumono quando passando nullo o -1 la chiamata di funzione genera un avviso PHP, che è considerato un errore.

La domanda è, come posso scrivere il mio caso di test PHPUnit in modo che abbia esito positivo quando le funzioni gestiscono null/-1 con garbo, e falliscono quando c'è un avviso PHP generato?

Grazie,

risposta

-1

Fare SomeClass genera un errore quando l'ingresso è valido e dire PHPUnit di aspettarsi un errore.

Un metodo è questo:

class ExceptionTest extends PHPUnit_Framework_TestCase 
{ 
    public function testLoadValueWithNull() 
    { 
     $o = new SomeClass();    
     $this->setExpectedException('InvalidArgumentException'); 
     $this->assertInstanceOf('InvalidArgumentException', $o::loadValue(null)); 
    } 
} 

Vedere documentation per ottenere altri metodi.

+3

Questo metodo richiede alterare la classe in prova che è probabilmente una buona idea per i valori degli argomenti non validi. –

+1

Questo approccio non è molto utile per le situazioni in cui si desidera che il metodo registri un avviso e continui. Ad esempio, se si dividono numeri e si richiede un output intero, la classe potrebbe arrotondare il risultato ed emettere un E_USER_WARNING per indicare che si è verificato un arrotondamento. Se invece si lancia un'eccezione, il flusso di esecuzione verrà interrotto. – GordonM

34

PHPUnit_Util_ErrorHandler::handleError() tiri uno dei diversi tipi di eccezione in base al codice di errore:

  • PHPUnit_Framework_Error_Notice per E_NOTICE, E_USER_NOTICE, e E_STRICT
  • PHPUnit_Framework_Error_Warning per E_WARNING e E_USER_WARNING
  • PHPUnit_Framework_Error per tutti gli altri

Puoi prenderli e aspettarti come faresti ogni altra eccezione.

/** 
* @expectedException PHPUnit_Framework_Error_Warning 
*/ 
function testNegativeNumberTriggersWarning() { 
    $fixture = new someClass; 
    $fixture->loadValue(-1); 
} 
3

È possibile anche scrivere un file phpunit.xml (sul test dir) con questo:

<phpunit 
convertErrorsToExceptions="true" 
convertNoticesToExceptions="false" 
stopOnFailure="false"> 
</phpunit> 
7

Quello che ha funzionato per me è stato modificando il mio phpunit.xml avere

<phpunit 
     convertErrorsToExceptions="true" 
     convertNoticesToExceptions="true" 
     convertWarningsToExceptions="true" 
     strict="true" 
     > 
</phpunit> 

La chiave era quella di utilizzare strict="true" per ottenere che gli avvisi generino un test non riuscito.

2

Vorrei creare un caso separato per verificare quando è previsto l'avviso/avviso.

Per PHPUnit v6.0 + Questa è la sintassi fino a oggi:

use PHPUnit\Framework\Error\Notice; 
use PHPUnit\Framework\Error\Warning; 
use PHPUnit\Framework\TestCase; 

class YourShinyNoticeTest extends TestCase 
{ 

    public function test_it_emits_a_warning() 
    { 
     $this->expectException(Warning::class); 

     file_get_contents('/nonexistent_file'); // This will emit a PHP Warning, so test passes 
    } 


    public function test_it_emits_a_notice() 
    { 
     $this->expectException(Notice::class); 

     $now = new \DateTime(); 
     $now->whatever; // Notice gets emitted here, so the test will pass 
    } 
} 
+0

Si noti che questo funzionerà solo con PHP 7.0. In qualsiasi versione successiva ci sono altre eccezioni specifiche per PHP. – sanmai

+0

@sanmai Non vedo questo problema. L'esempio sopra funziona anche con PHP 7.2 e PHPUnit 7.0 - l'ho appena testato. –

Problemi correlati