gpt4 book ai didi

php - 您将如何使用 PHPUnit 测试包含 check_admin_referer() 的 Wordpress 函数?

转载 作者:可可西里 更新时间:2023-11-01 14:00:46 26 4
gpt4 key购买 nike

我刚刚开始使用 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());

}

我已经尝试在 tests/bootstrap.php 和测试类本身中通过 $_POST 手动设置 nonce、action 和 _wp_http_referer。我已经阅读了一些关于模拟对象/方法的内容,但不太了解在这种情况下如何使用它们。

我可能完全误解了这一切的工作原理,但我们将不胜感激任何帮助!

最佳答案

问题是测试在命令行模式下运行,当然,当前用户未在那里进行身份验证。

有几种方法可以让它发挥作用。一种选择是 stub 验证检查函数 check_admin_referer() 或其底层 wp_verify_nonce()。但这不是最好的方法,因为那里的测试具有集成风格,而 stub 更像是一种单元测试方法。

一个好的解决方案是对用户进行身份验证以使测试通过。你可以像这样相对容易地做到这一点:

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 是否有效,因为它可能是私有(private)属性(property)。所以你可以将它作为硬编码字符串传递:

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']);
}

我认为您不需要在测试后清除新创建的随机数,因为 WP 原始测试也不会清除它。

太好了。


改进

如果测试用例中的所有测试都需要身份验证,您可能希望将随机数创建放入 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 连接到它 - 这将帮助您逐步检查代码并查看有什么不符合您的预期。这比盲目地与所有那些 nonces、http referrers 等作斗争要好。


注意

WP 代码非常可悲。全局命名空间中的大量函数、缺乏 OOP、没有完整的请求处理周期(例如,意外的 die())——真的很令人沮丧,因为它使代码库的扩展和测试变得非常困难。

因此请准备好与代码进行更多的斗争:)

关于php - 您将如何使用 PHPUnit 测试包含 check_admin_referer() 的 Wordpress 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38922259/

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