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 は、 指定したモックオブジェクトでの すべてのメソッドの実行 の、ゼロからはじまるインデックスを参照します。
と書かれていた。つまり上記のコードは「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 を期待する」というテストになる。
コメントを残す