我刚开始用Wordpress学习PHPUnit.我有一个插件可以从change.org获取请愿数据.其中一个管理类函数验证来自Wordpress管理区域的设置,并在此验证过程中调用`check_admin_referer().public function sc_validate_setting...
我刚开始用Wordpress学习PHPUnit.我有一个插件可以从change.org获取请愿数据.其中一个管理类函数验证来自Wordpress管理区域的设置,并在此验证过程中调用`check_admin_referer().
public function sc_validate_settings() {
//check nonce field is valid
check_admin_referer($this->plugin_name, 'security');
//get new settings
$settings = $this->sc_clean_new_settings();
//validate url
$valid_url = $this->sc_validate_url($settings['petition_url']);
//validate api_key
$valid_api_key = $this->sc_validate_api_key($settings['petition_api_key']);
if ($valid_url && $valid_api_key) {
$this->clean_settings = $settings;
return true;
}
return false;
}
如果我注释掉check_admin_referer(),那么这个PHPUnit测试会通过,但如果没有,我就无法通过.
public function testValidateSettings() {
$this->assertTrue($this->plugin_admin->sc_validate_settings());
}
我已尝试手动设置一个nonce,action和_wp_http_referer,并通过test / bootstrap.php中的$_POST和测试类本身通过wp_nonce_field()设置.我已经阅读了一些关于模拟对象/方法的内容,但是在这个实例中并没有看到它们如何被使用.
我可能完全误解了所有这些是如何工作的,但任何帮助将不胜感激!
最佳答案:
问题是测试在命令行模式下运行,当然,当前用户未在那里进行身份验证.
如何使其工作有几种选择.一种选择是将auth-check函数check_admin_referer()或其底层的wp_verify_nonce()存根.但这不是最好的方法,因为测试有集成的味道,而存根更像是单元测试的方法.
一个好的解决方案是验证用户以使测试通过.你可以这样做比较容易:
public function testValidateSettings() {
$_REQUEST['security'] = wp_create_nonce($this->plugin_admin->plugin_name);
$this->assertTrue($this->plugin_admin->sc_validate_settings());
}
我不相信$this-> plugin_admin-> plugin_name会起作用,因为它可能是私有财产.所以你可以将它作为硬编码字符串传递:
public function testValidateSettings() {
$_REQUEST['security'] = wp_create_nonce('whatever your plugin name is');
$this->assertTrue($this->plugin_admin->sc_validate_settings());
}
在测试后清理也很棒,所以你的测试用例肯定应该有:
public function tearDown() {
unset($_REQUEST['security']);
}
我不认为你需要在测试后清理新创建的nonce,因为WP原始测试也不会清除它.
这很漂亮.
起色
如果测试用例中的所有测试都需要身份验证,您可能希望将nonce-creation放入setUp() – 这将使测试用例更漂亮,因为拆卸代码将与设置问题匹配:
public function setUp() {
$_REQUEST['security'] = wp_create_nonce('whatever your plugin name is');
}
public function tearDown() {
unset($_REQUEST['security']);
}
public function testValidateSettings() {
$this->assertTrue($this->plugin_admin->sc_validate_settings());
}
建议
安装Xdebug并通过IDE连接到它 – 这将帮助您逐步完成代码,看看哪些内容无法正常工作.这比盲目地与所有这些nonce,http引用等等一起挣扎更好.
注意
WP代码非常难过.全局命名空间中的大量函数列表,缺少OOP,没有完整的请求处理周期(例如意外的die()) – 实在令人沮丧,因为它使代码库的扩展和测试变得非常困难.
所以准备好与代码进行更多的战斗:)
本文标题为:PHPUnit如何测试包含check_admin_referer()的WordPress函数?
基础教程推荐
- 织梦dedecms如何在dede:sql中使用[field:global.autoindex/] 2022-08-27
- 织梦dedecms调用当前栏目文章数的方法 2022-11-08
- dedecms根据来访IP区域自动跳转对应页面的方法 2022-07-21
- pbootcms网站自动清理runtime缓存方法 2023-07-09
- pbootcms二次开发必须要了解的后台目录结构 2023-07-09
- 织梦DedeCMS搜索指定多个栏目文档的办法 2022-11-11
- dedecms织梦全局变量调用方法总结 2023-07-08
- PbootCMS网站标题描述等标签限制字数的办法 2023-07-08
- dedecms织梦cms常用判断语句汇总 2022-06-24
- dedecms织梦无需登录注册可下单购买的修改 2022-11-04