PHPUnit | 测试json返回

Mer*_*kos 4 php wordpress phpunit unit-testing

我是PHPUnit测试的新手,如果可行,我需要一些帮助.

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

在我的插件中,我创建了一个创建一些add_action的类('wp_ajax_actionname',数组(__ 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);

}
Run Code Online (Sandbox Code Playgroud)

上面的函数它将Query结果返回到Object中,并通过使用json_encode函数进行回应.

问题是,我该如何测试上述方法?有没有办法测试它?

com*_*857 5

您将需要处理两个不那么测试友好的事情:

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

你必须处理的另一个问题是die(-1)最后的问题.您可以使用php测试助手中set_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();
}
Run Code Online (Sandbox Code Playgroud)

在最坏的情况下,可能是这样的:

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
}
Run Code Online (Sandbox Code Playgroud)

在里面tested_function_runner.php:

include 'path/to/the/plugin.php';
function_under_test();
Run Code Online (Sandbox Code Playgroud)

你当然可以通过传递和使用的参数使这个转轮脚本更加通用$argv.


oll*_*lle 5

如果您喜欢它,请同时查看PHPUnit的输出测试功能,它们非常棒.

(正如complex857所说,这个问题有很多点点滴滴,但对于输出测试,依靠这个PHPUnit内置功能.)

该手册非常有说服力且有用:https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.output