存根单个函数 - 不涉及 class - php
stub a single function - no class involved - php
您看到的第一个函数 in this wp source code 是我想要存根的,根据 phpunit 文档,我将存根 class,然后是方法和那个方法会 return。然后我可以调用 class 并期望该方法被调用一次。
如何在以下函数中使用 - 我在 class:
public function checked($value, $option, $key) {
$options = get_option($option);
if (isset($options[$key]) && $options[$key] == $value) {
return $this->checked = 'checked';
}
}
你可以看到我调用 get_option()
我需要将该函数存根到 return 一个特定的数组,我如何在 php 中做到这一点?
您不能存根函数。
它与 classes 一起工作的原因是因为 PHPUnit 动态创建 PHP 源代码,声明一个模拟 class 扩展原始代码,覆盖要存根的函数。它不能与声明为 final 的函数一起使用。
但是,有一种情况甚至允许存根函数:使用命名空间。
调用函数将首先尝试调用当前命名空间中同名的函数。如果有none,则使用全局命名空间。这样,即使在命名空间内,您也可以直接调用 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");
因此,如果您将测试放入命名空间,并在同一命名空间中定义函数,则对该函数的调用将被拦截。
现在唯一的麻烦是你要测试的 class 中的代码必须在同一个命名空间中(或者反过来 - 测试和存根函数必须在class 你想测试) - 如果不是,你不能将函数添加到该命名空间。此外,您只能添加函数 ONCE - 您应该知道如何使函数的行为像模拟一样,也许有一个全局变量包含用于检查调用和提供 return 值的已配置模拟对象。
然而,这一切迟早会变得一团糟。在 PHP.
中,全局函数不能真正以干净的方式 mocked/stubbed
可以使用 runkit 存根函数。
看看 runkit_function_redefine,它允许用另一个包含自定义逻辑的函数临时替换一个函数。
事实上,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 方法!
您看到的第一个函数 in this wp source code 是我想要存根的,根据 phpunit 文档,我将存根 class,然后是方法和那个方法会 return。然后我可以调用 class 并期望该方法被调用一次。
如何在以下函数中使用 - 我在 class:
public function checked($value, $option, $key) {
$options = get_option($option);
if (isset($options[$key]) && $options[$key] == $value) {
return $this->checked = 'checked';
}
}
你可以看到我调用 get_option()
我需要将该函数存根到 return 一个特定的数组,我如何在 php 中做到这一点?
您不能存根函数。
它与 classes 一起工作的原因是因为 PHPUnit 动态创建 PHP 源代码,声明一个模拟 class 扩展原始代码,覆盖要存根的函数。它不能与声明为 final 的函数一起使用。
但是,有一种情况甚至允许存根函数:使用命名空间。
调用函数将首先尝试调用当前命名空间中同名的函数。如果有none,则使用全局命名空间。这样,即使在命名空间内,您也可以直接调用 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");
因此,如果您将测试放入命名空间,并在同一命名空间中定义函数,则对该函数的调用将被拦截。
现在唯一的麻烦是你要测试的 class 中的代码必须在同一个命名空间中(或者反过来 - 测试和存根函数必须在class 你想测试) - 如果不是,你不能将函数添加到该命名空间。此外,您只能添加函数 ONCE - 您应该知道如何使函数的行为像模拟一样,也许有一个全局变量包含用于检查调用和提供 return 值的已配置模拟对象。
然而,这一切迟早会变得一团糟。在 PHP.
中,全局函数不能真正以干净的方式 mocked/stubbed可以使用 runkit 存根函数。
看看 runkit_function_redefine,它允许用另一个包含自定义逻辑的函数临时替换一个函数。
事实上,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 方法!