Mockery上的is_callable :: mock()总是返回true

时间:2016-11-30 14:36:07

标签: php unit-testing phpunit mockery

我的代码根据被模拟对象是否有方法而分支。

在实际课程中,我有2个选项来检查方法是否存在:is_callablemethod_exists

// Defining mocks for test
$emptyMock = m::mock();
$mockWithExpectation = m::mock()
    ->shouldReceive('foo')
    ->andReturn('bar')->getMock();

// Trying to perform checks inside of tested class
method_exists($emptyMock, 'foo'); // false
method_exists($mockWithExpectation, 'foo'); // false

is_callable([$emptyMock, 'foo']); // true
is_callable([$mockWithExpectation, 'foo']); // true

让我们在mock上调用这些方法。

$emptyMock->foo(); // \BadMethodCallException
$mockWithExpectation->foo(); // 'bar'

如您所见,方法正确执行/失败。

是否可以确定方法是否可以在没有测试类明确知道他正在处理mock的情况下调用。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

看来我嘲弄得太过分了,因为我需要的功能存在于vanilla PHPunit中。

$mock = $this->getMockBuilder(stdClass::class)
    //->setMethods(['foo']) 
    ->getMock();

is_callable([$mock, 'foo']); // gives true only if foo is set