2017-11-28 2 views
0

내가 시험에 노력하고 방법의 예외모의 phpunit을

try { 
    $fooClass->doStuff(); // Throws \Lib\Custom\Exception 
} 
catch (\Lib\Custom\Exception $exception) { 
    return false; 
} 

나는 반환이 거짓 테스트 할 같은 시도 캐치를 가지고,하지만 내 시험 excecuted 때 사용자 정의 예외가로드되지 않습니다.

PHP 단위는 수업을 조롱 할 수있는 옵션이 있지만 예외로 사용할 수 없습니다. Argument 1 passed to PHPUnit_Framework_MockObject_Builder_InvocationMocker::willThrowException() must be an instance of Exception, instance of Mock_Exception_c4dd9394 given

어떻게 제대로 기능을 테스트하기 위해이 예외를 조롱하기 :

$exceptionMock= $this->getMockBuilder(\Lib\Custom\Exception::class)->getMock(); 

$fooClassMock = $this->getMockBuilder(fooClass::class)->getMock() 
    ->method('doStuff') 
    ->willThrowException($exceptionMock); 

는 나에게 folowing 예외를 부여?

+0

'\ Lib \ Custom \ Exception'은'\ Exception'을 연장합니까? – xmike

+0

예,하지만 composer.json 자동로드에 없습니다. –

+0

그래서 mock이 생성되면'\ Exception'의 자식이 아닌 것처럼 보입니다. – xmike

답변

1

이유입니다. 그런 일이 일어나고 PHPUnit에서 모의 ​​객체를 만들면 클래스 정의를 작성하는 데 몇 가지 기술을 적용한 다음이를 확장하여 모의 객체를 만듭니다. 그렇지 않으면 클래스 자체를 확장하여 사용하면 문제가 없었을 것입니다.

이 경우, PHPUnit은 가짜 \Lib\Custom\Exception을 만든 다음이를 사용하여 모의를 만듭니다. 생성 된 가짜 클래스는 (확장/구현해야할 것을 모르기 때문에) 아무 것도 확장하지 않습니다. 따라서 모의 객체가 Exception으로 확장되지 않았기 때문에 willThrowException의 유형 힌트가 일치하지 않습니다.

클래스가 테스트에서로드되지 않은 경우 PHPUnit의 확장 클래스에 대한 모든 유형 힌팅에서이 문제가 발생합니다. 이 문제를 해결하려면 require, include 또는 autoloader를 통해 테스트에서 클래스를 사용할 수 있어야합니다.

+0

예, 답입니다. 나는 지금 그것을 적재하고 제대로 작동한다. 그리고 lib 클래스 조롱을위한 많은 코드를 저장합니다. –

2

나는 예외를 조롱 할 필요가 없다고 생각합니다.

왜이 기능을 사용하지 않으시겠습니까? 클래스가 테스트에 알려져 있지 않기 때문에 테스트가 작동하지

$fooClassMock = $this->getMockBuilder(fooClass::class)->getMock() 
    ->method('doStuff') 
    ->willThrowException(new \Lib\Custom\Exception()); 

또는 유사한 ..

+0

테스트를 실행하는 동안'\ Lib \ Custom \ Exception()'이 알려지지 않았기 때문에 클래스 'Twizo \ Api \ Entity \ Exception'을 찾을 수 없습니다.라는 오류가 발생합니다. –

+1

잘 알려지지 않았다면, 조롱 당하거나 단순히 사용되지는 않을 것입니다. 경로를 편집해야 알 수 있습니다. 당신이 그것을 한 후에, 나는 여전히 당신이 그것을 사용하고 조롱하지 말 것을 제안합니다. – backbone

+0

좋아, 나는 이것이 유일한 해결책 일지 모른다는 것에 대해 사과했다. 내 자동로드에 포함시킵니다. :/ 도움 주셔서 감사합니다. –