嘲讽和method_exists
Mockery and method_exists
我需要用 Mockery 模拟一个被模拟的 class 方法的存在,但是当我使用 method_exists 检查时我得到了一个错误的结果:
$mock = m::mock('ClassA')->makePartial();
$mock->shouldReceive('getMethod')->andReturn('A');
var_dump(method_exists($mock, 'getMethod'));
结果:
bool(false)
如何让它发挥作用?
getMethod 必须不存在于 ClassA 中,method_exists 才会失败。
当模拟一个现有的 class 时,method_exists 将 return 对 class 中实际存在的任何方法为真。
当方法不存在时,由于shouldReceive实际上不会定义方法而是使用重载(__call
),它仍然会return false。
您可以覆盖 class 正在测试的命名空间的 method_exists
函数...
下面的代码进入测试用例文件...
// someTest.php
namespace App\Class\Under\Test\Namespace;
function method_exists($object, $method_name) {
if ($method_name == 'getMethod') {
return true;
}
return \method_exists($object, $method_name);
};
我需要用 Mockery 模拟一个被模拟的 class 方法的存在,但是当我使用 method_exists 检查时我得到了一个错误的结果:
$mock = m::mock('ClassA')->makePartial();
$mock->shouldReceive('getMethod')->andReturn('A');
var_dump(method_exists($mock, 'getMethod'));
结果:
bool(false)
如何让它发挥作用?
getMethod 必须不存在于 ClassA 中,method_exists 才会失败。
当模拟一个现有的 class 时,method_exists 将 return 对 class 中实际存在的任何方法为真。
当方法不存在时,由于shouldReceive实际上不会定义方法而是使用重载(__call
),它仍然会return false。
您可以覆盖 class 正在测试的命名空间的 method_exists
函数...
下面的代码进入测试用例文件...
// someTest.php
namespace App\Class\Under\Test\Namespace;
function method_exists($object, $method_name) {
if ($method_name == 'getMethod') {
return true;
}
return \method_exists($object, $method_name);
};