0

テスト スイートはacceptedオブジェクト A を呼び出します。その関数は、insert実行しているテストに応じて、オブジェクト B を特定の回数呼び出します。

insert各テストで適切な回数呼び出されていることを確認したいと思います。オブジェクト A はテスト内でモックにヒットしないため、モックを使用して数えることはできないと思います。

2 年前からこの質問を見ました: PHPUnit Test How Many Times A Function Is Called

カウントにグローバル変数を使用することは理想的ではありません。クラス専用のコードをクラスに含めるべきではないからです。

編集

insertが静的であることに注意してください。クラスをモックして、その関数のみをモックするように指定しても、new直面している別の障害であるモック オブジェクトを呼び出します。

ANSWER 答えはノーです。@zerkmsが私を助けてくれたので、私はそれを受け入れることができるので、@zerkmsにその答えを出してもらいたいだけです。

私は最終的にオブジェクトを 1 つだけ使用できると考えましたが、別の障害にぶつかりました: PHPUnit がこの関数を実行済みとしてカウントしないのはなぜですか?

4

2 に答える 2

0

runkitを使用して、静的メソッドをその場で再定義できます(ただし、おそらくそうすべきではありません)。それ以外は、コードを再構築する必要があります。非静的呼び出しと依存性注入を使用するか(オブジェクトAが外部ソースからオブジェクトBを受け取り、代わりにテストがモックに合格できるようにする)、または依存性注入コンテナーを使用して、クラス名が関連付けられず、テストで作成できるようにします。モックサブクラスを作成し、クラスAにそれを使用させます(これはより厄介ですが、メソッドを静的のままにしておくことができるため、非テストコードの変更ははるかに少なくて済みます)。

于 2012-05-10T20:38:44.777 に答える
0

この特定のケースでは不可能のようです。

ただし、特定のケースでは、静的メソッドをモックできます: http://sebastian-bergmann.de/archives/883-Stubbing-and-Mocking-Static-Methods.html

class Foo
{
    public static function doSomething()
    {
        return static::helper();
    }

    public static function helper()
    {
        return 'foo';
    }
}

テスト:

public function testQQQ()
{
    $class = $this->getMockClass(
        'Foo',          /* name of class to mock     */
        array('helper') /* list of methods to mock   */
    );

    $class::staticExpects($this->exactly(2))
        ->method('helper')
        ->will($this->returnValue('bar'));

    $this->assertEquals(
        'bar',
        $class::doSomething()
    );
}

結果:

$ phpunit --filter QQQ
PHPUnit 3.6.10 by Sebastian Bergmann.

Configuration read from /var/www/.../phpunit.xml

F

Time: 1 second, Memory: 10.75Mb

There was 1 failure:

1) ...::testQQQ
Expectation failed for method name is equal to <string:helper> when invoked 2 time(s).
Method was expected to be called 2 times, actually called 1 times.


FAILURES!
Tests: 1, Assertions: 2, Failures: 1.
于 2012-05-09T22:31:34.697 に答える