我有以下要测试的课程:
<?php
namespace Freya\Component\PageBuilder\FieldHandler;
use Freya\Component\PageBuilder\FieldHandler\IFieldHandler;
/**
* Used to get a set of non empty, false or null fields.
*
* The core purpose is to use this class to determine that A) Advanced Custom Fields is installed
* and B) that we get back a set of fields for a child page.
*
* The cavete here is that this class requires you to have child pages that then have Custom Fields that
* you want to display on each of those pages. getting other page information such as content, title, featured image
* and other meta boxes is left ot the end developer.
*
* @see Freya\Component\PageBuilder\FieldHandler\IFieldHandler
*/
class FieldHandler implements IFieldHandler {
/**
* {@inheritdoc}
*
* @return bool
*/
public function checkForAFC() {
return function_exists("register_field_group");
}
/**
* {@inheritdoc}
*
* @param $childPageID - the id of the child page who may or may not have custom fields.
* @return mixed - Null or Array
*/
public function getFields($childPageId) {
$fieldsForThisPage = get_fields($childPageId);
if (is_array($fieldsForThisPage)) {
foreach ($fieldsForThisPage as $key => $value) {
if ($value === "" || $value === false || $value === null) {
unset($fieldsForThisPage[$key]);
}
}
return $fieldsForThisPage;
}
return null;
}
}
我可以测试所有这些,但我要做的一件事是将get_fields()
函数存根,说你将返回这种类型的数组,然后使用它的其余部分如何使用它,在这种情况正在循环中。
我不知道如何在php中执行的部分是一个被调用的函数,然后说你将返回x。
那么如何存根get_fields
?
答案 0 :(得分:2)
您在全局命名空间中定义此类函数。看一下下面的例子:
namespace {
function getFields($pageId) {
return array($pageId);
}
}
namespace MyNamespace {
class MyClass
{
public function foo(){
var_dump(getFields(5));
}
}
$obj = new MyClass();
$obj->foo();
}
这是输出:
array(1) {
[0]=>
int(5)
}
唯一的问题是此函数将存在直到脚本结束。要解决此问题,您可以将tearDown方法与runkit库一起使用:
http://php.net/manual/en/function.runkit-function-remove.php
允许您删除用户定义的函数。 不幸的是,这个库在Windows上不存在,因此您将无法删除该定义,并且可能会考虑单独运行测试。
编辑: 您还可以考虑使用此库(它还取决于runkit): https://github.com/tcz/phpunit-mockfunction
答案 1 :(得分:1)
您可以在此处使用非限定函数名称 indx <- x*(x <=3)
max.col(indx)*!!rowSums(indx)
#[1] 0 3 2
。由于您不使用完全限定的函数名get_fields()
,PHP将首先尝试在当前命名空间中查找该函数,然后再回退到全局函数名。
有关限定和非限定的定义,请参阅:http://php.net/manual/en/language.namespaces.basics.php(它类似于绝对和相对文件名)
所以你需要做的是在类的命名空间中定义函数,以及测试用例,如下所示:
\get_fields()