29

オーバーライドされたすべてのメソッドのデフォルト値を使用してsetUpでモックインスタンスを作成しようとしています。次に、いくつかの異なるテストで、モック全体をセットアップすることなく、テストしているものに応じていくつかのメソッドの戻り値を変更します. これを行う方法はありますか?

これは私が試したものですが、素朴なアプローチは機能しません。このメソッドは、元の期待設定からの値を返します。

最初のセットアップ:

$my_mock->expects($this->any())
        ->method('one_of_many_methods')
        ->will($this->returnValue(true));

別のアサートの前の別のテスト:

$my_mock->expects($this->any())
        ->method('one_of_many_methods')
        ->will($this->returnValue(false));

この質問に複製します: PHPUnit Mock 期待を後で変更します、しかし、その質問には応答がなく、新しい質問が問題を前面に出す可能性があると思いました。

4

6 に答える 6

11

同じメソッドを複数回使用する場合は、コード内で実行される適切な回数で「at」宣言を使用する必要があります。このようにして、PHPUnit はどちらを意味するかを認識し、期待/アサーションを適切に満たすことができます。

以下は、メソッド「run」が数回使用される一般的な例です。

public function testRunUsingAt()
    {
        $test = $this->getMock('Dummy');

        $test->expects($this->at(0))
            ->method('run')
            ->with('f', 'o', 'o')
            ->will($this->returnValue('first'));

        $test->expects($this->at(1))
            ->method('run')
            ->with('b', 'a', 'r')
            ->will($this->returnValue('second'));

        $test->expects($this->at(2))
            ->method('run')
            ->with('l', 'o', 'l')
            ->will($this->returnValue('third'));

        $this->assertEquals($test->run('f', 'o', 'o'), 'first');
        $this->assertEquals($test->run('b', 'a', 'r'), 'second');
        $this->assertEquals($test->run('l', 'o', 'l'), 'third');
    }

これはあなたが探しているものだと思いますが、誤解されている場合はお知らせください。

何かをモックするという点では、何度でもモックできますが、セットアップと同じ名前でモックしたくないでしょう。そうしないと、使用するたびにセットアップを参照することになります。異なるシナリオで同様のメソッドをテストする必要がある場合は、テストごとにモックします。セットアップで 1 つのモックを作成できますが、1 つのテストでは、グローバル名ではなく、個々のテスト内で同様の項目の別のモックを使用します。

于 2012-12-21T03:36:46.067 に答える
6

ラムダ コールバックを使用してこれを行うことができます。

$one_of_many_methods_return = true;
$my_mock->expects($this->any())
        ->method('one_of_many_methods')
        ->will(
             $this->returnCallback(
                 function () use (&$one_of_many_methods_return) {
                     return $one_of_many_methods_return;
                 }
              )         
          );
$this->assertTrue($my_mock->one_of_many_methods());

$one_of_many_methods_return = false;

$this->assertFalse($my_mock->one_of_many_methods());    

ステートメントに注意&してください。use

于 2014-05-30T12:13:49.837 に答える
2

これを行う1つの方法は、次のようなデータプロバイダーを使用することです。

/**
 * @dataProvider methodValueProvider
 */
public function testMethodReturnValues($method, $expected) {
  // ...
  $my_mock->expects($this->any())
          ->method($method)
          ->will($this->returnValue($expected));
  // ...
}

public function methodValueProvider() {
  return array(
    array('one_of_many_methods', true),
    array('another_one_of_many', false)
  );
}

編集:申し訳ありませんが、あなたの質問を読み間違えました。上記は(明らかに)あなたが探しているものではありません。

于 2012-11-29T20:20:21.147 に答える
1

私はこれを試していませんが、セットアップでモックをセットアップしてから、各テストでセットアップできませんでした:

public function testMethodReturnsTrue
{
    $this->my_mock->will($this->returnValue(true));
    $this->assertTrue( ... );
    ...
}

最初のモックが作成されたときではなく、テストで will() メソッドを設定しようとしているため、これが機能するかどうかはわかりません。

于 2012-11-30T14:47:59.150 に答える