gpt4 book ai didi

PHP单元 |测试json返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:03:03 26 4
gpt4 key购买 nike

我是 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 函数回显。

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

最佳答案

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

带回显的输出生成。为此,您可以将有问题的函数调用包装在 ob_start() ... ob_end_clean() 对中,以获得将被回显的输出。
编辑:
事实证明,库中已经内置了对此的支持,查看 Testing Output section of the manual .

您必须处理的另一个问题是最后的die(-1)。您可以使用 set_exit_overload() php test helpers 中提供的功能禁用它的效果,这样你的测试过程就不会随着代码一起消失。这有点难设置(你需要一个 C 编译器)。如果这对你不起作用,你可能会倒霉,因为你不能将代码更改为更易于测试的代码。 (我不太熟悉 wordpress,但对于 ajax 插件,这个 die() 用法似乎是 recommended )。作为最后的手段,您可以尝试使用 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 传递和使用的参数使此运行器脚本更通用。

关于PHP单元 |测试json返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17269577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com