存根单个函数 - 没有涉及的类 - php

时间:2015-04-22 20:38:51

标签: php wordpress phpunit

你看到的第一个函数in this wp source code是我想要的东西,根据phpunit文档,我将存根该类,然后是方法以及该方法将返回的内容。然后我可以调用该类并期望该方法被调用一次。

以下功能如何 - 我在课堂上有:

public function checked($value, $option, $key) {
    $options = get_option($option);

    if (isset($options[$key]) && $options[$key] == $value) {
        return $this->checked =  'checked';
    }
}

你可以看到我调用get_option()我需要将该函数存根以返回特定的数组,我该如何在php中执行此操作?

3 个答案:

答案 0 :(得分:2)

你不能存根函数。

它与类一起工作的原因是因为PHPUnit动态创建PHP源代码,声明一个扩展原始的模拟类,覆盖要被存根的函数。并且它不能用于声明为final的函数。

但是,有一种情况允许甚至存根函数:使用命名空间。

调用函数将首先尝试在当前名称空间中调用该名称的函数。如果没有,则使用全局命名空间。这样,即使在命名空间内,您也可以直接调用PHP函数,如strpos(),而不必担心使用反斜杠为它们添加前缀。

现在以此为例:

namespace Stub;

function strpos($foo, $bar) {
    return "The return value is stubbed";
}

# This will not call the PHP function
echo strpos("string", "i");

因此,如果您将测试放入命名空间,并在同一命名空间中定义该函数,则会截获对该函数的调用。

现在唯一的烦恼是要测试的类中的代码必须位于同一名称空间中(或者反过来说 - 测试和存根函数必须位于要测试的类的名称空间中) - 如果不是,则无法将该函数添加到该命名空间。另外,你只能添加函数ONCE - 你应该知道如何使函数像mock一样运行,也许有一个包含配置的模拟对象的全局变量,用于检查调用并提供返回值。

然而,这迟早会变得混乱。在PHP中,全局函数无法以干净的方式进行模拟/存根。

答案 1 :(得分:0)

可以使用runkit来存根函数。

看看runkit_function_redefine,它允许暂时替换另一个包含自定义逻辑的函数。

答案 2 :(得分:0)

事实上,WordPress使用了很多功能,并且很难以干净的方式存根。

但是,你可以做的是将函数包装在这样的方法中:

public function get_option($option) {
    return get_option($option);
}

public function checked($value, $option, $key) {
    $options = $this->get_option($option);

    if (isset($options[$key]) && $options[$key] == $value) {
        return $this->checked =  'checked';
    }
}

现在您可以轻松模拟get_option方法!