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函数进行回应.
问题是,我该如何测试上述方法?有没有办法测试它?
您将需要处理两个不那么测试友好的事情:
带回声的输出生成.为此,您可以在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.
如果您喜欢它,请同时查看PHPUnit的输出测试功能,它们非常棒.
(正如complex857所说,这个问题有很多点点滴滴,但对于输出测试,依靠这个PHPUnit内置功能.)
该手册非常有说服力且有用:https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.output
| 归档时间: |
|
| 查看次数: |
2128 次 |
| 最近记录: |