Как unit test Свойства PHP
Я хочу знать, есть ли решение о том, как модульно тестировать черту PHP.
Я знаю, что мы можем протестировать класс, который использует черту. но мне было интересно, есть ли лучшие подходы.
Спасибо за любой совет заранее.
ИЗМЕНИТЬ
Один из вариантов заключается в том, чтобы использовать Trait в самом классе теста, поскольку я собираюсь продемонстрировать ниже.
Но Я не так увлечен этим подходом, так как нет никакой гарантии, что между признаком, классом и 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');
}
}
Ответы
Ответ 1
Вы можете протестировать Trait с помощью аналогичного тестирования конкретных методов абстрактного класса.
PHPUnit имеет метод 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());
}
}
?>