带有WordPress全局函数和PHPUnit的TDD

时间:2015-10-13 03:03:41

标签: wordpress mocking phpunit tdd

我正在尝试用我的WordPress插件做tdd。问题是使用WP_UnitTestCase是减慢速度的方法,尽管名称提供了集成测试而不是单元测试。因此,我不是使用WP_UnitTestCase而是为我的插件创建真正独立的测试,但问题是我发现自己使用了很多WordPress全局函数,例如wp_get_current_user()或wp_signon()。

目前我有一个我已经使用过的函数文件,这些文件基本上已被删除了。

嘲笑这些功能的最佳方法是什么?最后,我希望能够以与其他方法相同的方式模拟这些函数,并能够控制它们的输出并测试它们的被调用。是否有更多OO方式来设置当前用户或检查我缺少的身份验证?

1 个答案:

答案 0 :(得分:2)

您可以创建一个用于调用全局WordPress函数的类。这可以有一个全局函数方法的映射,甚至可以使用wp_或者你提出的任何其他方式调用以__call开头的任何方法。

然后你可以在你的插件中使用这个类来调用这些函数。我想插件是由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类并将模拟注入插件,以便控制所调用的函数。