2015-12-18 18 views
6

php7関数が整数だけを受け入れることを検証しようとしています。phpunit catch php7 TypeErrorを作成する

これはクラスです:

<?php 

declare(strict_types=1); 

class Post 
{ 
    private $id; 

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

そして、これはテストです:

<?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); 
     } 
    } 
} 

私が手にエラーがある:

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

は、検証することが可能ですエラー?また、それはそのような小切手を実行する意味がありますか?

答えて

12

はい、for any other exceptionと同じ方法でTypeErrorをテストできます。

しかし、タイプミスマッチの場合にPHPがタイプエラーを出すことはテストしません。これはPHP 7コードで余計なテストになります。それはErrorを拡張しながら、悲しい

+0

あなたは、テストの型の不一致の余分に側面についての詳細を与えることができますか? 'myMethod()'の最初の引数に型ヒントを追加することを忘れていないことをチェックするのはなぜ役に立たないのですか? – marcv

+0

これは当てはまりません。 PHPUnitはデフォルトで、PHPのエラー、警告、およびテストの実行中に発生した通知を例外に変換します。PHPを期待するには '@expectedException PHPUnit \ Framework \ Error'が必要です'Error'(PHP 7の' assert() 'によって生成された' Error'を含む)です。これは逆に直感的ではありません。 – chili

+0

この問題を解決する方法を説明することができますか? https://stackoverflow.com/questions/48486568/catch-an-error-as-exception – zioMitch

3

TypeErrorは、Exceptionreference)のサブクラスありません。彼らが実際に共有しているのは、Throwableインターフェイスだけです。 ThrowMatcherは実際にTypeErrorをキャッチできません。

あなたは src/PhpSpec/Matcher/ThrowMatcher.phpのコードを見れば、あなたはPHPSpecのが「Exception」 を継承する例外をキャッチし、その例外のインスタンスの型をチェックしていることがわかります 。

this answerも参照してください。

1

はこれを試してみてください:

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

参考になりますか? docなど? – michaelbn

+1

上記のように、TypeErrorはExceptionのサブクラスではないため、何も修正されません。 –

関連する問題