PHP trait。を単体テストする方法に解決策があるかどうかを知りたい。
特性を使用しているクラスをテストできることは知っていますが、より良いアプローチがあるかどうか疑問に思っていました。
事前にアドバイスをありがとう:)
[〜#〜] edit [〜#〜]
もう1つの方法は、テストクラス自体で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');
}
}
抽象クラスの具象メソッドのテストに似た方法を使用して、トレイトをテストできます。
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());
}
}
?>