PHPUnit |测试json返回
我是PHPUnit测试的新手,如果可能的话,我需要一些帮助 我在WordPress中安装了一个插件,用于单元测试,它基于PHPUnit框架。我目前正在构建一个使用AJAX调用的WordPress插件,以便与WordPress数据交互 在我的插件中,我创建了一个类来创建一些add\u操作('wp\uajax\uactionname',array('uuuuuuuu Class\uuuuuuu,'functionName')) functionName如下所示: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
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提出的想法!!:)