2012-02-25 2 views
9

'클래스'에 함수가 있는지 어떻게 확인할 수 있는지 궁금합니다. assertClassHasAttribute가 작동하지 않습니다. Function이 Attribute가 아니기 때문에 정상입니다.HowTo PHPUnit assertFunction

+2

왜 당신이 검사 할 것인가? – Gordon

+0

리팩터링을 할 때 유용합니다 ... 테스트를 통해 클래스에 포함 된 메소드가 어떤 이유로 클래스를 다른 클래스로 옮겨야 할 때 유용합니다 : 디커플링 책임 등에 대한 것입니다. – HexaGridBrain

+0

의존성이 적절하게 조롱되거나 스텁되어 있는지 그리고 공용 API가 완전하게 다루어 졌는지를 확인할 때 절대 필요하지 않을 것입니다. – Gordon

답변

32

phpunit을 I가 제공하는 주장의 방법을 만들거나 자세한 메시지와 함께 낮은 수준의 주장 중 하나를 사용 중 하나가 아니다 :

$this->assertTrue(
    method_exists($myClass, 'myFunction'), 
    'Class does not have method myFunction' 
); 

assertTrue()는 당신이 얻을 수있는만큼 기본이다. 테스트에 bool 값을 반환하는 내장 된 PHP 함수를 사용할 수 있기 때문에 많은 유연성을 허용합니다. 따라서 테스트가 실패하면 오류/실패 메시지는 전혀 도움이되지 않습니다. Failed asserting that <FALSE> is TRUE과 같은 것입니다. 따라서 두 번째 매개 변수를 assertTrue()에 전달하여 테스트가 실패한 이유를 자세히 설명해야합니다.

7

단위 및 통합 테스트는 클래스 정의가 무엇인지 다시 테스트하지 않는 동작을 테스트하기위한 것입니다.

그래서 PHPUnit은 그러한 단정을 제공하지 않습니다. phpunit을 클래스가 함수 값 뭔가를해야만 반환, 이름 X를 가지고 주장 할 수 있습니다,하지만 당신은 당신이 사용하고 싶은 것을 할 수 있습니다

/** 
* Assert that a class has a method 
* 
* @param string $class name of the class 
* @param string $method name of the searched method 
* @throws ReflectionException if $class don't exist 
* @throws PHPUnit_Framework_ExpectationFailedException if a method isn't found 
*/ 
function assertMethodExist($class, $method) { 
    $oReflectionClass = new ReflectionClass($class); 
    assertThat("method exist", true, $oReflectionClass->hasMethod($method)); 
} 
+0

굉장합니다. 이것은 내 필요에 완벽하게 들린다. 고마워 @ 모나 셰키 나 – shan