2016-11-30 2 views
0

내 코드는 조롱 된 객체가 메소드를 가졌는지 여부에 따라 분기됩니다.is_callable on Mockery :: mock() 항상 true를 반환합니다.

실제 클래스에는 메소드 존재를 확인하는 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 

모의에서 이러한 메소드를 호출 해 봅시다.

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

실례로, 메소드가 올바르게 실행/실패합니다.

테스트 된 클래스가 모의 객체를 처리하고 있음을 명시 적으로 알지 못하고 메소드가 호출 가능한지 여부를 알아낼 수 있습니까?

미리 도움을 주셔서 감사합니다.

+1

객체가 구현 된 마법 __call() 메소드가있는 경우, 다음 is_callable() method_exists()는 FALSE를 반환합니다 반면, 어떤 존재하지 않는 방법에 대한 TRUE를 반환합니다. – Matteo

답변

0

바닐라 PHPunit에 필자가 요구하는 기능이 있기 때문에 나는 너무 조롱 거리로 보인다.

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

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