4

私は PHPUnit のテストに非常に慣れていないので、可能であれば助けが必要です。

単体テスト用に、PHPUnit Framework に基づくプラグインを WordPress にインストールしました。現在、WordPress データを操作するために、AJAX 呼び出しを使用する WordPress プラグインを作成しています。

私のプラグインでは、 add_action('wp_ajax_actionname', array(__CLASS__, 'functionName')) を作成するクラスを作成しました

functionName は次のようになります。

function functionName()
{

global $wpdb;

if(wp_verify_nonce($_POST['s'], 'cdoCountryAjax') != false)
{
    $zones  =   $wpdb->get_results(
        $wpdb->prepare(
            "
                SELECT
                    zone_id AS ID,
                    name    AS Name
                FROM
                    " . $wpdb->prefix . "cdo_zone
                WHERE
                    country_id = %d
            ",
            $_POST['id']
        )
    );

    header('Cache-Control: no-cache, must-revalidate');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Content-type: application/json');

    $results    =   array();

    foreach($zones as $zone)
    {
        $results[$zone->ID] =   $zone->Name;
    }

    echo json_encode($results);
}

die(-1);

}

上記の関数は、オブジェクトに返されたクエリ結果を取得し、json_encode 関数を使用してエコーしました。

問題は、上記の方法をどのようにテストできますか? それをテストする方法はありますか?

4

2 に答える 2

5

対処しなければならない、あまりテストに適していないことが 2 つあります。

エコーによる出力生成。このために、問題の関数呼び出しをob_start()...ob_end_clean()ペア内にラップして、エコーされたはずの出力を取得できます。
編集:
結局のところ、ライブラリにはこれに対する組み込みのサポートが既にあります。マニュアルのテスト出力セクションを確認してください。

対処しなければならないもう 1 つの問題はdie(-1)、最後にあります。PHP テスト ヘルパーset_exit_overload()で提供されている関数を使用してその効果を無効にすることができるため、テスト プロセスがコードと共に停止することはありません。これはセットアップが少し難しくなります (C コンパイラが必要です)。それがうまくいかない場合は、コードをよりテストしやすいものに変更できない場合に備えて、運が悪い可能性があります。(私はワードプレスにはあまり詳しくありませんが、ajax プラグインの場合、この使用法が推奨されているようです)。最後の手段として、 orを使用してスクリプトをサブプロセスとして実行し、その方法で結果を取得することができます (ソースを含み、テストされない関数を呼び出すファイルを作成する必要があります)。die()popen()exec()

理想的なケースでは、これは次のようになります。

function test_some_wp_plugin_test() {
    // deal with the die()
    set_exit_overload(function() { return false; });

    // set expectation on the output
    $expected_result = array('foo' => 'bar');
    $this->expectOutputString(json_encode($expected_result));

    // run function under the testing
    function_in_test();
}

最悪の場合、おそらく次のようになります。

function test_some_wp_plugin_test() {
    $output = array();
    // you will need cli php installed for this, on windows this would be php.exe at the front
    $results =  exec('php tested_function_runner.php', $output);
    // start asserting here
}

そして内部tested_function_runner.php

include 'path/to/the/plugin.php';
function_under_test();

もちろん、 から渡されて使用されるパラメーターを使用して、このランナー スクリプトをより一般的なものにすることができます$argv

于 2013-06-24T07:21:53.070 に答える
5

気が向いたら、PHPUnitの出力テスト機能も見てみてください。

(complex857 が言ったように、この問題には多くの細かな部分がありますが、出力テストについては、この PHPUnit 組み込み機能に頼ってください。)

マニュアルは雄弁で役に立ちます: https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.output

于 2013-06-24T13:35:51.070 に答える