반응형
테스트 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
반응형
'programing' 카테고리의 다른 글
AJAX를 사용하여 변수를 PHP로 전달하고 AJAX를 사용하여 변수를 다시 검색 (0) | 2023.08.25 |
---|---|
사용자 양식 = 빈 사용자 양식에 동적으로 레이블 추가 (0) | 2023.08.25 |
주어진 경로에서 엑셀 파일에 데이터 프레임 쓰기 (0) | 2023.08.25 |
스프링 JDB성능 측면에서 CTemplate VS 최대 절전 모드 (0) | 2023.08.25 |
iPhone에서 UIView 컨트롤러를 팝업으로 표시 (0) | 2023.08.25 |