2017-11-28 6 views
0

私がテストしようとしているメソッドの例外モックPHPUnitの

try { 
    $fooClass->doStuff(); // Throws \Lib\Custom\Exception 
} 
catch (\Lib\Custom\Exception $exception) { 
    return false; 
} 

私はリターンが偽テストするようにtryキャッチを持っていますが、私のテストがexcecutedされたときにカスタム例外がロードされていません。

PHP単位にはクラスをモックするオプションがありますが、これを例外として使用することはできません。

$exceptionMock= $this->getMockBuilder(\Lib\Custom\Exception::class)->getMock(); 

$fooClassMock = $this->getMockBuilder(fooClass::class)->getMock() 
    ->method('doStuff') 
    ->willThrowException($exceptionMock); 

は私にfolowing例外を与える: Argument 1 passed to PHPUnit_Framework_MockObject_Builder_InvocationMocker::willThrowException() must be an instance of Exception, instance of Mock_Exception_c4dd9394 given

適切に機能をテストするには、この例外を模擬するためにどのように?

+0

'\ Lib \ Custom \ Exception'は' \ Exception'を拡張していますか? – xmike

+0

はい、そうですが、composer.jsonの自動ロードにはありません。 –

+0

だから模擬が作成されるとき、それは '\ Exception'の子ではないようです。 – xmike

答えて

1

クラスはテストでは知られていないので、あなたのテストが機能していない理由があります。それが起こったときに、PHPUnitでモックを作成すると、クラス定義を作成するのにトリッキーなことがありますし、それを拡張してモックを作成します。それ以外の場合は、クラス自体を拡張することになり、問題は発生しませんでした。

この場合、PHPUnitは偽物\Lib\Custom\Exceptionを作成し、それを使ってモックを作成します。作成された偽のクラスは何も拡張しません(何を拡張/実装するか分からないため)。したがって、モックオブジェクトがExceptionに拡張されていないため、willThrowExceptionのタイプヒントは一致しません。

これは、クラスがテストでロードされていない場合、PHPUnitの拡張クラスのヒントとして使用されます。これを修正するには、require、include、またはautoloaderを使用してテストでクラスを使用できるようにする必要があります。

+0

これは答えです。私は今それをロードし、それは正常に動作します。そして、libクラスを嘲笑するためのたくさんのコードを私に救います。 –

2

例外を模擬する必要はないと思います。

なぜこれを試してみませんか?

$fooClassMock = $this->getMockBuilder(fooClass::class)->getMock() 
    ->method('doStuff') 
    ->willThrowException(new \Lib\Custom\Exception()); 

または類似のもの...

+0

'\ Lib \ Custom \ Exception()'はテストを実行している間は分かりませんので、 'Class 'Twizo \ Api \ Entity \ Exception'が見つかりませんでした。 –

+1

よく知られていれば、嘲笑されず、単に使われることもありません。 あなたはそのパスを編集する必要があります。あなたがそれをした後、私はまだあなたがそれを嘲笑しないで使用することを提案します。 – backbone

+0

さて、私はこれが唯一の解決策であるかもしれないことを肯定しました。 私はそれを私のオートロードに含めます。 :/ ご協力ありがとうございます! –

関連する問題