你看到的第一个函数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中执行此操作?
答案 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方法!