PHPUnitを使用するメソッドの単体テストを書いています。私がテストしているメソッドは、同じオブジェクトに対して同じメソッドを3回呼び出しますが、引数のセットは異なります。私の質問は here および here の質問に似ています
他の投稿で尋ねられた質問は、1つの引数のみをとるモックメソッドに関係しています。
ただし、私のメソッドは複数の引数を取り、次のようなものが必要です。
_$mock->expects($this->exactly(3))
->method('MyMockedMethod')
->with($this->logicalOr($this->equalTo($arg1, $arg2, arg3....argNb),
$this->equalTo($arg1b, $arg2b, arg3b....argNb),
$this->equalTo($arg1c, $arg2c, arg3c....argNc)
))
_
equalTo()
は1つの引数のみを検証するため、このコードは機能しません。複数の引数を指定すると、例外がスローされます。
PHPUnit_Framework_Constraint_IsEqual :: __ construct()の引数#2は数値でなければなりません
複数の引数を持つメソッドに対してlogicalOr
モッキングを行う方法はありますか?
前もって感謝します。
私の場合、答えは非常にシンプルでした。
_$this->expects($this->at(0))
->method('write')
->with(/* first set of params */);
$this->expects($this->at(1))
->method('write')
->with(/* second set of params */);
_
重要なのは、n
がメソッドのN番目の呼び出しである$this->at(n)
を使用することです。試したlogicalOr()
バリアントのいずれでも何もできませんでした。
入力パラメータを一致させ、複数の呼び出しに戻り値を提供することを考えている他の人にとっては、これは私にとってはうまくいきます:
$mock->method('myMockedMethod')
->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2])
->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);
$map = array(
array('arg1_1', 'arg2_1', 'arg3_1', 'return_1'),
array('arg1_2', 'arg2_2', 'arg3_2', 'return_2'),
array('arg1_3', 'arg2_3', 'arg3_3', 'return_3'),
);
$mock->expects($this->exactly(3))
->method('MyMockedMethod')
->will($this->returnValueMap($map));
または、使用できます
$mock->expects($this->exactly(3))
->method('MyMockedMethod')
->will($this->onConsecutiveCalls('return_1', 'return_2', 'return_3'));
入力引数を指定する必要がない場合
誰かがphpunitドキュメントの correspondent section を見ずにこれを見つけた場合、withConsecutiveメソッドを使用できます
$mock->expects($this->exactly(3))
->method('MyMockedMethod')
->withConsecutive(
[$arg1, $arg2, $arg3....$argNb],
[arg1b, $arg2b, $arg3b....$argNb],
[$arg1c, $arg2c, $arg3c....$argNc]
...
);
この唯一の欠点は、コードがMyMockedMethodを指定された引数の順に呼び出す必要があることです。私はまだこれを回避する方法を見つけていません。