web-dev-qa-db-ja.com

単体テストの方法PHP traits

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');
    }
}
35
Ali

抽象クラスの具象メソッドのテストに似た方法を使用して、トレイトをテストできます。

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());
    }
}
?>
67
Schleis