Prophecy で typehint を指定している時に TypeError になる

このissueに書いてある内容です。

私もこれで1日はまりました。

テスト対象の処理の中で依存するインスタンスのメソッドを呼び出しており、そのメソッドにtypehintがついているときに発生します。

例えば依存しているインスタンスのメソッドが以下のようになっているとします。

class Depend
{
    public function hoge(): int
    {
        return 101;
    }
}

Prophecy を使ってテストコードを書いたときにおそらく以下のようにします。

$dummy = $this->prophesize(Depend:class);
$sut = new Client($dummy->reveal());
$sut->do();
$dummy->hoge()->shouldHaveBeenCalled();

Clientのdo()が実行されると、Dependのhoge()が実行されるようになっています。

しかし、$dummy には hoge() がないので null が返ります。

hoge() の戻り値は int なので、食い違いが発生して TypeError になります。

これを回避するには、明示的に $dummyのhoge()がどういうものかを指定する必要があります。

$dummy->hoge()->willReturn(101);

これで、$dummy->hoge()が101を返すようになるので、typehintのint1とマッチしてエラーは解消されます。

が、なんか使いにくいなと感じました。

PHP

Posted by たみぼうず