【问题标题】:TDD with WordPress global functions and PHPUnit带有 WordPress 全局函数和 PHPUnit 的 TDD
【发布时间】:2016-01-10 15:47:25
【问题描述】:
我正在尝试使用我的 WordPress 插件进行 tdd。问题是使用 WP_UnitTestCase 是一种减慢速度的方式,尽管名称提供了集成测试而不是单元测试。因此,我没有使用 WP_UnitTestCase,而是一直致力于为我的插件创建真正独立的测试,但问题是我发现自己使用了很多 WordPress 全局函数,例如 wp_get_current_user() 或 wp_signon()。
目前我有一个我使用过的函数的文件,这些函数基本上都被删除了。
模拟这些函数的最佳方法是什么?最终,我希望能够像其他方法一样模拟这些函数,并能够控制它们的输出并测试它们是否被调用。是否有更多面向对象的方法来设置当前用户或检查我缺少的身份验证?
【问题讨论】:
标签:
wordpress
mocking
phpunit
tdd
【解决方案1】:
您可以创建一个类来调用全局 WordPress 函数。这可以将方法映射到全局函数,甚至可以使用__call 或您想出的任何其他方式调用以wp_ 开头的任何方法。
然后你会在你的插件中使用这个类来调用函数。我想插件是由 WordPress 实例化的,因此您将无法在生产代码中注入此类。因此,您可以使其外部设置以允许注入模拟,但如果没有提供,请使用真实的。
像这样:
<?php
class Plugin
{
private $invoker;
public function getWpInvoker()
{
if (!isset($this->invoker)) {
$this->invoker = new WordPressGlobalFunctionsInvoker();
}
}
public function setWpInvoker(WordPressGlobalFunctionsInvoker $invoker)
{
$this->wp_invoker = $invoker;
}
public function foo()
{
$current_user = $this->getWpInvoker()->wp_get_current_user();
}
}
在测试中,您将模拟 WordPressGlobalFunctionsInvoker 类并将模拟注入插件,以便您控制被调用的函数。