문제

phpunit으로 추상 클래스의 구체적인 방법을 어떻게 테스트합니까?

나는 시험의 일부로 일종의 객체를 만들어야한다고 기대한다. 그러나, 나는 이것에 대한 모범 사례를 모르거나 phpunit이 이것을 허용하는지 전혀 모른다.

도움이 되었습니까?

해결책

추상 클래스의 단위 테스트는 초록 클래스가 구체적인 방법을 가질 수 있고이 구체적인 방법을 테스트 할 수 있으므로 인터페이스를 테스트하는 것을 의미하지는 않습니다.

라이브러리 코드를 작성할 때 응용 프로그램 계층에서 확장 할 특정 기본 클래스를 갖는 것은 드문 일이 아닙니다. 도서관 코드가 테스트되었는지 확인하려면 추상 클래스의 구체적인 방법을 사용해야합니다.

개인적으로, 나는 phpunit을 사용하고 있으며, 이런 종류의 것들을 테스트하는 데 도움이되는 스터브와 모의 물체라고 불렀습니다.

곧바로 phpunit 매뉴얼:

abstract class AbstractClass
{
    public function concreteMethod()
    {
        return $this->abstractMethod();
    }

    public abstract function abstractMethod();
}

class AbstractClassTest extends PHPUnit_Framework_TestCase
{
    public function testConcreteMethod()
    {
        $stub = $this->getMockForAbstractClass('AbstractClass');
        $stub->expects($this->any())
             ->method('abstractMethod')
             ->will($this->returnValue(TRUE));

        $this->assertTrue($stub->concreteMethod());
    }
}

Mock Object는 여러 가지를 제공합니다.

  • 당신은 초록 클래스를 구체적으로 구현할 필요가 없으며 대신 스터브로 도망 갈 수 있습니다.
  • 구체적인 방법을 부르고 그들이 올바르게 수행한다고 주장 할 수 있습니다.
  • 구체적인 방법이 구현되지 않은 (Abstract) 메소드에 의존하는 경우 will () phpunit 메소드를 사용하여 리턴 값을 포함시킬 수 있습니다.

다른 팁

그건 좋은 질문이야. 나도 이것도 찾고 있었다.
운 좋게도 PhPunit은 이미 가지고 있습니다 getMockForAbstractClass() 이 경우 방법, 예를 들어

protected function setUp()
{
    $stub = $this->getMockForAbstractClass('Some_Abstract_Class');
    $this->_object = $stub;
}

중요한:

이것은 phpunit> 3.5.4가 필요합니다. 거기있었습니다 버그 이전 버전에서.

최신 버전으로 업그레이드하려면 :

sudo pear channel-update pear.phpunit.de
sudo pear upgrade phpunit/PHPUnit

PHP 7 지원에 따라 익명 수업 추가되었다. 이를 통해 PHPUNIT- 특이 적 기능에 의존하지 않는 추상 클래스 테스트를 설정하기위한 추가 방법이 제공됩니다.

class AbstractClassTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var AbstractClass
     */
    private $testedClass;

    public function setUp()
    {
        $this->testedClass = new class extends AbstractClass {

            protected function abstractMethod()
            {
                // Put a barebones implementation here
            }
        };
    }

    // Put your tests here
}

에란, 방법은 작동해야하지만 실제 코드 전에 테스트를 작성하는 경향에 위배됩니다.

제가 제안하는 것은 해당 추상 클래스의 비 임계 하위 클래스의 원하는 기능에 대한 테스트를 작성한 다음 추상 클래스와 구현 서브 클래스를 모두 작성하고 마지막으로 테스트를 실행하는 것입니다.

테스트는 추상 클래스의 정의 된 방법을 분명히 테스트해야하지만 항상 서브 클래스를 통해 테스트해야합니다.

넬슨의 대답은 잘못되었습니다.

추상 클래스는 모든 방법을 추상적으로 요구하지는 않습니다.

구현 된 방법은 테스트 해야하는 방법입니다.

당신이 할 수있는 일은 단위 테스트 파일에서 가짜 스터브 클래스를 만들고, 추상 클래스를 확장하고 물론 기능이 전혀없는 상태에서 필요한 것만 구현하고 테스트하는 것입니다.

건배.

Abstract 클래스에서 이미 구현 된 메소드에 대한 단위 테스트를 수행하기 위해 추상 클래스를 서브 클래스를 하위 클래스하지 않으려면 프레임 워크가 허용하는지 확인할 수 있습니다. 모조품 초록 수업.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top