4

我对 PHPUnit 测试非常陌生,如果可能的话,我需要一些帮助。

我在 WordPress 中安装了一个基于 PHPUnit 框架的插件,用于单元测试。我目前正在构建一个使用 AJAX 调用的 WordPress 插件,以便与 WordPress 数据进行交互。

在我的插件中,我创建了一个类来创建一些 add_action('wp_ajax_actionname', array(__CLASS__, '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

您将不得不处理两件对测试不太友好的事情:

带有回声的输出生成。为此,您可以将有问题的函数调用包装在ob_start()...ob_end_clean()对中,以获取本应回显的输出。
编辑
事实证明,库中已经有对此的内置支持,请查看手册的测试输出部分

您必须处理的另一个问题是die(-1)最后。您可以使用php test helpersset_exit_overload()中提供的功能来禁用它的效果,这样您的测试过程就不会随着代码一起死掉。这有点难以设置(您将需要一个 C 编译器)。如果这对您不起作用,那么您可能会不走运,以防您无法将代码更改为对测试更友好的代码。(我对 wordpress 不太熟悉,但对于 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 回答