如何使用PHPUnit测试依赖于特定PHP版本的语句?

如何使用PHPUnit测试依赖于特定PHP版本的语句?,php,phpunit,code-coverage,Php,Phpunit,Code Coverage,我有一个这样的结构: class Foo { public function doFoo($value = '') { if (function_exists('foo')) { return foo($value); } // if php version does not support foo() // ... } } <?php /** * Your

我有一个这样的结构:

class Foo
{
    public function doFoo($value = '')
    {
        if (function_exists('foo'))
        {
            return foo($value);
        }
        // if php version does not support foo()
        // ...
    }
}
<?php
/**
 * Your test method
 */
public function testSomething () {

    // if the function not exists, create a simulation
    if(!function_exists('foo')) {
        function foo() {
            return $aValue;
        }
    }

    // your test code ...
}
如果函数foo的存在取决于安装的PHP版本,那么如何使用PHPUnit测试此代码以实现100%的代码覆盖率(在本例中,我假设函数存在,否则不可能实现100%的代码覆盖率)。有没有办法在运行时禁用/启用PHP函数

有什么办法解决吗

编辑:

我找到了一个解决方案:高级PHP调试器/PECL扩展为此提供了一个函数*rename_function*

bool rename_函数(字符串$original_name,字符串$new_name)

将全局函数表中的原始名称重命名为新名称。暂时有用 重写内置函数


您可以在测试方法中定义
foo()
的模拟。这样做:

class Foo
{
    public function doFoo($value = '')
    {
        if (function_exists('foo'))
        {
            return foo($value);
        }
        // if php version does not support foo()
        // ...
    }
}
<?php
/**
 * Your test method
 */
public function testSomething () {

    // if the function not exists, create a simulation
    if(!function_exists('foo')) {
        function foo() {
            return $aValue;
        }
    }

    // your test code ...
}

在PHP5.3及更高版本中,您可以重写任何PHP函数的行为

看看这个

namespace Test
{
    function function_exists($function)
    {
        return false;
    }

    var_dump(function_exists('var_dump')); // bool(false)
}

这是可能的,因为PHP的。简而言之,当它遇到一个函数时,它首先检查该函数是否存在于当前名称空间中。如果没有,则返回全局名称空间。

您使用的PHP版本是什么?可能是5.3吗?我用的是PHP5.3.15。具体的问题是,我实现了一个用于创建密码哈希的PBKDF2方法。现在,我发现PHP>=5.5.0时存在函数hash_pbkdf2。