如何在PHP中存根此函数

时间:2015-07-09 16:35:23

标签: php phpunit stubbing

我有以下要测试的课程:

<?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

2 个答案:

答案 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()

附加说明: