F.Ko-Jiの「一秒後は未来」

PHPUnitでモックのメソッドのN回目の呼び出しを検証するのにat()は使わないほうがよかった

PHPUnit でモックのメソッド呼び出しにおいて、1回目の呼び出しはこの引数、2回目の呼び出しはこの引数という検証をするのに at() というメソッドが使えるようだったので以下のようなコードを書いていた。

$mock = $this->getMock('SomeClass');

$mock->expects($this->at(0))
    ->method('someMethod')
    ->with(1);

$mock->expects($this->at(1))
    ->method('someMethod')
    ->with(2);

しかしテストによっては at() の引数を 0 ではなく 1 から始めないと上手くパスしないことがあって困ってしまった。そこでよくよくドキュメントを調べてみると、

at() マッチャーのパラメータ $index は、 指定したモックオブジェクトでの すべてのメソッドの実行 の、ゼロからはじまるインデックスを参照します。

» PHPUnit マニュアル – 第9章 テストダブル

と書かれていた。つまり上記のコードは「someMethod の 0 回目の呼び出し」という意味ではなく、「モックオブジェクトの 0 回目のメソッド呼び出しで呼び出されるのは someMethod という名前のメソッド」という意味だと考えないといけない。分かりづらい。

なので at() は使わずに exactly() と withConsecutive() を使うほうがよかった。

$mock->expects($this->exactly(2))
    ->method('someMethod')
    ->withConsecutive(
        [$this->equalTo(1)],
        [$this->equalTo(2)]
    );

これで「someMethod というメソッドが2回呼び出され、1回目の呼び出し時の引数は 1 で、2回目の呼び出し時の引数は 2 を期待する」というテストになる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など