PHPUnit |测试json返回

PHPUnit |测试json返回,php,wordpress,unit-testing,phpunit,Php,Wordpress,Unit Testing,Phpunit,我是PHPUnit测试的新手,如果可能的话,我需要一些帮助 我在WordPress中安装了一个插件,用于单元测试,它基于PHPUnit框架。我目前正在构建一个使用AJAX调用的WordPress插件,以便与WordPress数据交互 在我的插件中,我创建了一个类来创建一些add\u操作('wp\uajax\uactionname',array('uuuuuuuu Class\uuuuuuu,'functionName')) functionName如下所示: function functionN

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

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

在我的插件中,我创建了一个类来创建一些add\u操作('wp\uajax\uactionname',array('uuuuuuuu Class\uuuuuuu,'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函数进行了响应


问题是,我如何测试上述方法?有什么方法可以测试它吗?

您必须处理两件不太利于测试的事情:

使用echo生成输出。为此,您可以将有问题的函数调用包装在
ob\u start()
ob\u end\u clean()。

编辑
事实证明,库中已经有了对此的内置支持,请查看

您必须处理的另一个问题是最后的
模具(-1)
。您可以使用中提供的函数来禁用其效果,这样您的测试过程就不会随着代码一起消失。设置起来有点困难(您需要一个C编译器)。如果这对您不起作用,那么如果您不能将代码更改为对测试更友好的代码,那么您可能会运气不佳。(我不太熟悉wordpress,但对于ajax插件来说,这似乎是
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
}
测试的函数\u runner.php中:

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

当然,您可以使用从
$argv

传递和使用的参数使此runner脚本更加通用。如果您愿意,还请查看PHPUnit的输出测试功能,它们非常棒

(正如complex857所说,这个问题有很多细节,但是对于输出测试,依赖于PHPUnit内置特性。)


该手册雄辩而有用:

您可以使用
wp\u die()
而不是
die()
。可以将其禁用以进行测试。请看并感谢hakre提出的想法!!:)