如何使用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。