2015-12-18 14 views
6

Próbuję sprawdzić, czy funkcja php7 akceptuje tylko liczby całkowite.Spraw, aby phpunit złapał php7 TypeError

Jest to klasa:

<?php 

declare(strict_types=1); 

class Post 
{ 
    private $id; 

    public function setId(int $id) 
    { 
     $this->id = $id; 
    } 
} 

I to jest test:

<?php 

declare(strict_types=1); 

class PostTest extends \PHPUnit_Framework_TestCase 
{ 
    private function getPostEntity() 
    { 
     return new Post(); 
    } 

    public function testSetId() 
    { 
     $valuesExpected = [123, '123a']; 
     foreach ($valuesExpected as $input) { 
      $this->getPostEntity()->setId($input); 
     } 
    } 
} 

Błąd pojawia się:

TypeError: Argument 1 passed to Post::setId() must be of the type integer, string given, called in /path/test/PostTest.php on line 35

Czy to możliwe, aby potwierdzić takie błąd? też, czy ma sens prowadzenie takiej kontroli?

Odpowiedz

12

Tak, można przetestować pod kątem TypeError w taki sam sposób, jak w przypadku for any other exception.

Jednakże, nie testowałbym, że PHP wysyła błąd typu w przypadku niezgodności typu. Jest to rodzaj testu, który staje się zbędny z kodem PHP 7.

+0

mógłbyś podać szczegóły dotyczące superflous aspekcie typu badania niedopasowania? Dlaczego bezużyteczne jest sprawdzenie, czy nie zapomniałem dodać wskazówki typu do pierwszego argumentu 'myMethod()', na przykład? – marcv

+0

Nie wydaje się, żeby tak było. Z Twojej własnej dokumentacji: 'Domyślnie PHPUnit konwertuje błędy PHP, ostrzeżenia i powiadomienia, które są wyzwalane podczas wykonywania testu do wyjątku." Wydaje się, że potrzebujesz '@expectedException PHPUnit \ Framework \ Error' aby oczekiwać dowolnego PHP 'Error's (w tym' Error's emitowane przez PHP 7 'assert()'), co jest mniej intuicyjne co najmniej. – chili

+0

Czy mógłbyś wyjaśnić (może za pomocą odsyłacza do dokumentacji), jak rozwiązać ten problem? https://stackoverflow.com/questions/48486568/catch-an-error-as-exception – zioMitch

3

Niestety TypeErrornie jest podklasą Exception (reference), natomiast rozszerza Error. Jedyne, co tak naprawdę dzielą, to interfejs Throwable. ThrowMatcher nie może faktycznie złapać TypeError.

Jeśli spojrzeć na kod w src/PhpSpec/Matcher/ThrowMatcher.php, widać, że PHPSpec łapie wyjątki, które dziedziczą „Exception” a następnie sprawdza typ instancji tego wyjątku.

Zobacz także this answer.

1

Spróbuj tego:

$this->expectException(TypeError::class); 
+0

Jakieś przydatne informacje? doc i etc? – michaelbn

+1

To niczego nie naprawia, ponieważ jak wspomniano powyżej TypeError NIE jest podklasą Exception. –

Powiązane problemy