1

phpunitでテストするとき、関数呼び出しをアサートしたいと思います。

与えられたクラス:

Class TimeWrapper {
  public function time() {
    return time();
  }
}

そしてそのユニットテスト:

Class TimeWrapperTest extends PHPUnit_FrameworkTestCase {
  public function testTime() {
    //Pseudocode as example of a possible solution:
    $this->assertCallsFunction("time");
  }
}

特に、グローバル関数の呼び出しをテストする方法を探しています。

FWIW:rspecでは、MessageExpectationsを使用します。PHPUnitで似たような、またはまったく似たようなものを実現したいと思っています。

4

2 に答える 2

0

その目的のためにすでに何かが行われているかどうかはわかりません。

ただし、自分で実装しようとしている場合は、xdebugコードカバレッジを確認できます。

于 2012-05-17T12:08:43.737 に答える
0

TimeWrapper組み込みのPHP関数を呼び出すことを確認することが目的の場合は、 runkit拡張機能timeを使用する必要があります。これにより、組み込み関数を、呼び出しを記録する独自のバージョンに置き換えることができます。内部関数の名前を変更できるようにするには、の設定を有効にする必要があります。runkit.internal_overridephp.ini

class TimeWrapperTest extends PHPUnit_Framework_TestCase {
    static $calledTime;

    function setUp() {
        self::$calledTime = false;
    }

    function testTimeGetsCalled() {
        $fixture = new TimeWrapper;
        try {
            runkit_function_rename('time', 'old_time');
            runkit_function_rename('new_time', 'time');
            $time = $fixture->time();
            self::assertTrue('Called time()', $calledTime);
        }
        catch (Exception $e) {
            // PHP lacks finally, but must make sure to revert time() for other test
        }
        runkit_function_rename('time', 'new_time');
        runkit_function_rename('old_time', 'time');
        if ($e) throw $e;
    }
}

function new_time() {
    TimeWrapperTest::$calledTime = true;
    return old_time();
}

拡張機能を使用できない場合、またはそのようなトリックを避けたい場合はTimeWrapper、実行時に呼び出される関数をオーバーライドできるように変更できます。

class TimeWrapper {
    private $function;

    public function __construct($function = 'time') {
        $this->function = $function;
    }

    public function time() {
        return call_user_func($this->function);
    }
}

コンストラクターを呼び出したり、コンストラクターrunkit_function_renameに渡したりせずに、上記のテストケースを使用します。ここでの欠点は、への呼び出しごとに本番環境で(おそらくわずかな)パフォーマンスペナルティを支払うことです。new_timeTimeWrapperTimeWrapper::time

于 2012-05-20T19:38:54.577 に答える