1

アサーション:

$chain->expects($this->once())
   ->method('addMethodCall')
   ->with(
       'addOptionsProvider',
       array(
          $this->isInstanceOf('Symfony\Component\DependencyInjection\Reference'),
          $this->equalTo(7)
       )
   );

$chainは実際には のモック オブジェクトでありDefinition、これがテストしたいコードです。

$definition->addMethodCall(
    'addOptionsProvider',
    array(new Reference($id), $priority)
);

私はPHPUnitを始めたばかりなので、何が欠けているのか本当にわかりません。引数についてのアサーションは、理解するのが本当に難しいと思います。アサーションと実際のパラメーターの視覚的な違いを示す画像を含めました。

PHPUnit_Framework_ExpectationFailedException : メソッド名の期待値が 1 回呼び出されたときと等しい 呼び出しのパラメータ 1 Symfony\Component\DependencyInjection\Definition::addMethodCall('addOptionsProvider', Array (...)) が期待値と一致しません。

ここに画像の説明を入力

編集:実際、私はこれで終わった:

$chain->expects($this->once())
    ->method('addMethodCall')
    ->with(
        $this->identicalTo('addOptionsProvider'),
        $this->logicalAnd(
            $this->isType('array'),
            $this->arrayHasKey(0),
            $this->arrayHasKey(1)
        )
    );

しかし、さらにアサーションを行うために配列の値に「入る」ことはできません!

4

1 に答える 1

2

->with()期待するものとは異なるメソッド シグネチャを持っています。

->with(string|PHPUnit_Framework_Constraint, ...)

つまり、PHPUnit は意味を理解できるほど「スマート」ではないため、そこに配列を渡すことはできません。

これをモックする最も簡単な方法は次のとおりです。

->with(
   'addOptionsProvider',
   array(
      new Reference(1),
      7
   )
)

配列を比較するだけです。

これをモックする別の方法 (オブジェクトなどでメソッド呼び出しを行う必要がある場合) を使用する

->with($this->callback(function($arg)  { ... } ));

そこで自分の主張をしてください。

複雑な例については、次を参照してください:具体的な値で atLeastOnce をモックします。残りは重要ではありません

于 2012-12-19T22:42:07.583 に答える