2016-01-02 8 views
7

PHP7では、スカラー型のヒントと厳密な型を持つサンプルメソッドをテストします。引数を渡さないと、メソッドはTypeErrorを投げます。間違って何declare(strict_types=1);PHPSpec PHP7における型エラーの捕捉

:私は宣言冒頭で

Uncaught TypeError: Argument 1 passed to Example::test

<?php 

class Example 
{ 
    public function test(string $name) 
    { 
     $this->name = $name; 
    } 
} 


class ExampleSpec extends ObjectBehavior 
{ 
    function it_is_initializable() 
    { 
     $this->shouldHaveType('Test\Example'); 
    } 

    function it_check_test_method_when_not_pass_argument() 
    { 
     $this->shouldThrow('\TypeError')->during('test'); 
    } 
} 

:致命的なエラーを返すPHPSpecの? TypeErrorの投げ方をテストするにはどうすればよいですか?

+0

例外はスローされますが、キャッチされません。それとも投げられていないのでしょうか? – Will

+0

メソッドはTypeErrorをスローし、catch TypeErrorが必要です。私は$ this-> shouldThrow( '\ TypeError') - > while( 'test')を使用します。メソッドがExceptionを返すがTypeErrorは返さない場合、PHPSpecのこのメソッドは機能します。 – Matrix12

+0

PHPSpecの最新バージョンを使用していますか? – Will

答えて

3

それは私がこれでユニットテストに注釈を付ける場合は動作します:

/** 
* @expectedException \TypeError 
*/ 

その後、私のテストは緑です。

5

さらに調査すると、これはPHPSpecのバグであり、hereと報告されています。バグは数ヶ月で修正されていないので、私はそれにコメントすることをお勧めします。

src/PhpSpec/Matcher/ThrowMatcher.phpのコードを見ると、PHPSpecが 'Exception'を継承する例外をキャッチし、その例外のインスタンスの種類を確認することがわかります。ただし、TypeErrorExceptionを継承せず、Errorから継承しています。 Exceptionと共通しているのは、両方ともThrowableインターフェイスを実装していることだけです。例えば

101  public function verifyPositive($callable, array $arguments, $exception = null) 
102  { 
103   try { 
104    call_user_func_array($callable, $arguments); 
105   } catch (\Exception $e) { 
106    if (null === $exception) { 
107     return; 
108    } 
109 
110    if (!$e instanceof $exception) { 
111     throw new FailureException(sprintf(
112      'Expected exception of class %s, but got %s.', 
113      $this->presenter->presentValue($exception), 
114      $this->presenter->presentValue($e) 
115    )); 
116    } 

バグを報告、これらの詳細を説明し、彼らにTypeErrorの継承についてthis documentationを示しました。私にとって

+1

私はバグを報告しました。このバグが修正される時期はわかりません。 – Matrix12

+0

@ Matrix12エラー(Error $ e)をキャッチしてエラーを捕まえることができます。Throwableをインターフェイスする特定のクラス –

関連する問題