2015-12-18 5 views
6

Ich versuche zu validieren, dass eine php7 Funktion nur ganze Zahlen akzeptiert.Mache phpunit catch php7 TypeError

Dies ist die Klasse:

<?php 

declare(strict_types=1); 

class Post 
{ 
    private $id; 

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

Und dies ist der 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); 
     } 
    } 
} 

Der Fehler, den ich bekommen ist:

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

Ist es möglich, so zu validieren Error? macht es auch Sinn, einen solchen Check durchzuführen?

Antwort

12

Ja, Sie können für TypeError auf die gleiche Weise testen, wie Sie for any other exception verwenden würden.

Ich würde jedoch nicht testen, dass PHP einen Typfehler im Falle einer Typabweichung ausgibt. Dies ist die Art von Test, der mit PHP 7 Code überflüssig wird.

+0

Könnten Sie Details geben über die superflous Aspekt der Nichtübereinstimmung Testtyp? Warum ist es sinnlos zu überprüfen, dass ich nicht vergessen habe, zum ersten Argument von 'myMethod()' einen Typhinweis hinzuzufügen? – marcv

+0

Dies scheint nicht der Fall zu sein. Aus Ihrer eigenen Dokumentation: 'Standardmäßig konvertiert PHPUnit PHP-Fehler, Warnungen und Hinweise, die während der Ausführung eines Tests ausgelöst werden, zu einer Ausnahme.Es scheint, dass Sie' @expectedException PHPUnit \ Framework \ Error' benötigen, um PHP zu erwarten 'Error's (einschließlich' Error's, die über PHP 7 'assert()' ausgegeben werden), was zumindest kontraintuitiv ist. – chili

+0

könnten Sie erklären (vielleicht mit einem Dokumentationsverweis), wie Sie dieses Problem lösen? https://stackoverflow.com/questions/48486568/catch-an-error-as-exception – zioMitch

3

Leider TypeErrorist nicht eine Unterklasse von Exception (reference), während es Error erstreckt. Das einzige, was sie teilen, ist die Throwable Schnittstelle. Der ThrowMatcher kann einen TypeError nicht abfangen.

Wenn Sie den Code anschauen in src/PhpSpec/Matcher/ThrowMatcher.php, Sie können sehen, dass PHPSpec Ausnahmen abfängt, die ‚Exception‘ erbt und überprüft dann den Instanztyp dieser Ausnahme.

Siehe auch this answer.

1

Versuchen Sie folgendes:

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

Irgendwelche nützliche Referenz? Doc und etc? – michaelbn

+1

Das behebt nichts, da TypeError wie oben erwähnt KEINE Unterklasse von Exception ist. –