3

重複の可能性:
PHP-既存の関数をオーバーライドする

モックを使用して、外部依存関係を持つ関数のいくつかを単体テストしたいと思います。

だからここに行きます...以下は私が扱っているものの単純化されたモデルです。私が継承したコードの多くはこのように書かれているので、可能であれば書き直さなくても簡単なテストを書けるようにしたいと思います。

function display_tasks($id)
{
    $tasks = call_some_function_that_runs_a_database_query($id);

    $html = "<some html>";

    foreach ($tasks as $task)
    {
        // Some operations here
    }

    $html .= "</some html>";

    return $html;
}

私の関数が呼び出しているコードはオブジェクトにラップされていないため、インターネット上の例の99%がオブジェクト指向コードに基づいているため、さまざまな例を実行するのに問題があります。PHPunitから直接手続き型関数をモックすることさえ可能ですか?

call_some_function_that_runs_a_database_query戻ってきたものは何でもモックアウトできるようにしたいと思います。組み込みのPHPunitモックメソッドを使用してみましたが、これを実行しても、関数の元の呼び出しの結果がオーバーライドされることはありません。

どんな助けや例も本当にありがたいです。

4

1 に答える 1

3

runkit PHP拡張機能を使用して、テスト中に必要なものを返す関数に置き換えることができます。すべてのケース(合格、不合格、エラー)でテスト後に元のオブジェクトを元に戻すように注意する必要があるため、オブジェクトをモックするよりも面倒です。

テスト中の機能

function getTasksFromDatabase($id) {
    // call to database...
}

テストケース

function stub_getTasksFromDatabase($id) {
    return array('one', 'two', 'three');
}

class getUserTest extends PHPUnit_Framework_TestCase {
    public static function setUpBeforeClass() {
        runkit_function_rename('getTasksFromDatabase', 'orig_getTasksFromDatabase');
        runkit_function_rename('stub_getTasksFromDatabase', 'getTasksFromDatabase');
    }

    public function tearDownAfterClass() {
        runkit_function_rename('getTasksFromDatabase', 'stub_getTasksFromDatabase');
        runkit_function_rename('orig_getTasksFromDatabase', 'getTasksFromDatabase');
    }

    public function setUp() {
        $html = getTasks(1);
        self::assertEquals('<some html>...one...two...three...</some html>', $html);
    }
}
于 2012-10-25T01:37:40.303 に答える