web-dev-qa-db-ja.com

PHPUnit:複数の引数を持つ複数のメソッド呼び出しをモックするにはどうすればよいですか?

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モッキングを行う方法はありますか?

前もって感謝します。

46
Thomas

私の場合、答えは非常にシンプルでした。

_$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()バリアントのいずれでも何もできませんでした。

73

入力パラメータを一致させ、複数の呼び出しに戻り値を提供することを考えている他の人にとっては、これは私にとってはうまくいきます:

    $mock->method('myMockedMethod')
         ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2])
         ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);
29
Cody A. Ray

マップから値を返すメソッド呼び出しのスタブ化

$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'));

入力引数を指定する必要がない場合

24
scriptin

誰かが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を指定された引数の順に呼び出す必要があることです。私はまだこれを回避する方法を見つけていません。

10
Pedro A.