我的代码根据被模拟对象是否有方法而分支。
在实际课程中,我有2个选项来检查方法是否存在:is_callable
和method_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的情况下调用。
提前感谢您的帮助。
答案 0 :(得分:0)
看来我嘲弄得太过分了,因为我需要的功能存在于vanilla PHPunit中。
$mock = $this->getMockBuilder(stdClass::class)
//->setMethods(['foo'])
->getMock();
is_callable([$mock, 'foo']); // gives true only if foo is set