67

PHPUnit を使用してメソッドの単体テストを作成しています。私がテストしているメソッドは、同じオブジェクトの同じメソッドを 3 回呼び出しますが、引数のセットが異なります。私の質問は、ここここで尋ねられた質問に似ています

他の投稿で尋ねられた質問は、引数を 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複数の引数を持つメソッドのモックを作成する方法はありますか?

前もって感謝します。

4

4 に答える 4

97

私の場合、答えは非常に単純であることがわかりました。

$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番目の呼び出しであるを使用$this->at(n)することです。試したバリアントnでは何もできませんでした。logicalOr()

于 2012-06-09T21:03:05.497 に答える
61

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

    $mock->method('myMockedMethod')
         ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2])
         ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);
于 2016-04-15T23:40:18.993 に答える
29

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

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

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

于 2012-06-09T20:59:45.133 に答える
13

誰かがphpunitドキュメントの対応するセクションを見ずにこれを見つけた場合は、 withConsecutiveメソッドを使用できます

$mock->expects($this->exactly(3))
     ->method('MyMockedMethod')
     ->withConsecutive(
         [$arg1, $arg2, $arg3....$argNb],
         [arg1b, $arg2b, $arg3b....$argNb],
         [$arg1c, $arg2c, $arg3c....$argNc]
         ...
     );

これの唯一の欠点は、コードが提供された引数の順序でMyMockedMethodを呼び出さなければならないことです。私はまだこれを回避する方法を見つけていません。

于 2015-01-20T12:34:38.633 に答える