嘲讽和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);
};