2011-02-19 11 views
16

Piszę przypadki testowe i tutaj jest to pytanie, które mam.Jak złapać PHP Ostrzeżenie w PHPUnit

więc powiedzieć, że jestem testowania prostą funkcję someClass::loadValue($value)

normalnym przypadku testu jest łatwe, ale zakładamy, gdy przechodzi w zerowy lub -1 wywołaniu funkcji generuje ostrzeżenie PHP, które jest uważane za błąd.

Pytanie brzmi: jak napisać mój test PHPUnit tak, aby zakończył się sukcesem, gdy funkcje z wdziękiem obsłużyły wartość null/-1 i nie powiodły się, gdy pojawiło się ostrzeżenie PHP?

Dzięki,

Odpowiedz

-1

Bądź SomeClass wygeneruje błąd, gdy wejście jest nieważny i powiedzieć phpunit oczekiwać błąd.

Jedna metoda jest taka:

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

Zobacz documentation więcej metod.

+3

Ta metoda wymaga zmiany klasy na podstawie testu, który jest dobrym pomysłem dla wartości Invalid argument. –

+1

To podejście nie jest przydatne w sytuacjach, w których chcesz, aby metoda rejestrowała ostrzeżenie i kontynuowała. Na przykład, jeśli dzielisz liczby i żądasz liczby całkowitej, klasa może zaokrąglić wynik i wydać polecenie E_USER_WARNING, aby wskazać, że zaokrąglenie wystąpiło. Jeśli zamiast tego wyrzucisz wyjątek, przepływ wykonania zostanie przerwany. – GordonM

34

PHPUnit_Util_ErrorHandler::handleError() rzuca jeden z kilku typów wyjątków opartych na kodzie błędu:

  • PHPUnit_Framework_Error_Notice dla E_NOTICE, E_USER_NOTICE, a E_STRICT
  • PHPUnit_Framework_Error_Warning dla E_WARNING i E_USER_WARNING
  • PHPUnit_Framework_Error dla wszystkich innych

Możesz je złapać i oczekiwać tak jak każdego innego wyjątku.

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

Można również zapisać plik phpunit.xml (po testach dir) z tym:

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

Co pracował dla mnie było modyfikując phpunit.xml mieć

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

Kluczem było użycie strict="true", aby ostrzeżenia zakończyły się niepowodzeniem.

2

Utworzę oddzielny przypadek, aby przetestować, kiedy oczekiwane jest powiadomienie/ostrzeżenie.

Dla PHPUnit v6.0 + to najświeższe składnią:

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

Zauważ, że będzie to działać tylko dla PHP 7.0. W późniejszych wersjach istnieją inne wyjątki specyficzne dla PHP. – sanmai

+0

@sanmai Nie widzę tego problemu. Powyższy przykład działa również z php 7.2 i PHPUnit 7.0 - sam go przetestowałem. –

Powiązane problemy