programing

테스트 PHP 특성을 단위화하는 방법

lastmoon 2023. 8. 25. 23:56
반응형

테스트 PHP 특성을 단위화하는 방법

저는 PHP 특성을 유닛 테스트하는 방법에 대한 해결책이 있는지 알고 싶습니다.

특성을 사용하는 클래스를 테스트할 수 있다는 것은 알지만, 더 나은 접근법이 있는지 궁금합니다.

미리 조언해주셔서 감사합니다 :)

편집

한 가지 대안은 아래에서 시연할 것처럼 테스트 클래스 자체에서 특성을 사용하는 것입니다.

하지만 저는 이 접근법에 별로 관심이 없습니다. 왜냐하면 특성, 클래스, 그리고 또한 그것들 사이에 유사한 방법 이름이 없다는 보장이 없기 때문입니다.PHPUnit_Framework_TestCase(이 예에서는):

다음은 특성의 예입니다.

trait IndexableTrait
{
    /** @var int */
    private $index;

    /**
     * @param $index
     * @return $this
     * @throw \InvalidArgumentException
     */
    public function setIndex($index)
    {
        if (false === filter_var($index, FILTER_VALIDATE_INT)) {
            throw new \InvalidArgumentException('$index must be integer.');
        }

        $this->index = $index;

        return $this;
    }

    /**
     * @return int|null
     */
    public function getIndex()
    {
        return $this->index;
    }
}

그리고 그 테스트:

class TheAboveTraitTest extends \PHPUnit_Framework_TestCase
{
    use TheAboveTrait;

    public function test_indexSetterAndGetter()
    {
        $this->setIndex(123);
        $this->assertEquals(123, $this->getIndex());
    }

    public function test_indexIntValidation()
    {
        $this->setExpectedException(\Exception::class, '$index must be integer.');
        $this->setIndex('bad index');
    }
}

추상 클래스의 구체적인 방법을 테스트하는 것과 유사한 방법을 사용하여 특성을 테스트할 수 있습니다.

PHPUit에는 특성을 사용하는 개체를 반환하는 getMockForTrait 메서드가 있습니다.그런 다음 특성 기능을 테스트할 수 있습니다.

다음은 설명서의 예입니다.

<?php
trait AbstractTrait
{
    public function concreteMethod()
    {
        return $this->abstractMethod();
    }

    public abstract function abstractMethod();
}

class TraitClassTest extends PHPUnit_Framework_TestCase
{
    public function testConcreteMethod()
    {
        $mock = $this->getMockForTrait('AbstractTrait');

        $mock->expects($this->any())
             ->method('abstractMethod')
             ->will($this->returnValue(TRUE));

        $this->assertTrue($mock->concreteMethod());
    }
}
?>

PHP 7 이후로 이제 익명 클래스를 사용할 수 있습니다...

$class = new class {
    use TheTraitToTest;
};

// We now have everything available to test using $class

사용할 수도 있습니다.getObjectForTrait원하는 경우 실제 결과를 주장합니다.

class YourTraitTest extends TestCase
{
    public function testGetQueueConfigFactoryWillCreateConfig()
    {
        $obj = $this->getObjectForTrait(YourTrait::class);

        $config = $obj->getQueueConfigFactory();

        $this->assertInstanceOf(QueueConfigFactory::class, $config);
    }

    public function testGetQueueServiceWithoutInstanceWillCreateConfig()
    {
        $obj = $this->getObjectForTrait(YourTrait::class);

        $service = $obj->getQueueService();

        $this->assertInstanceOf(QueueService::class, $service);
    }
}

언급URL : https://stackoverflow.com/questions/31083192/how-to-unit-test-php-traits

반응형