web-dev-qa-db-fra.com

Comment faire un test unitaire PHP traits

Je veux savoir s'il existe une solution sur la façon de tester à l'unité un trait PHP.

Je sais que nous pouvons tester une classe qui utilise le trait, mais je me demandais s'il y avait de meilleures approches.

Merci pour tout conseil à l'avance :)

MODIFIER

Une alternative consiste à utiliser le trait dans la classe de test elle-même, comme je vais le montrer ci-dessous.

Mais Je ne suis pas très intéressé par cette approche car il n'y a aucune garantie, il n'y a pas de noms de méthodes similaires entre le trait, la classe et aussi le PHPUnit_Framework_TestCase (dans cet exemple):

Voici un exemple de trait:

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;
    }
}

et son test:

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

Vous pouvez tester un trait en utilisant une méthode similaire à celle des méthodes concrètes d'une classe abstraite.

PHPUnit a une méthode getMockForTrait qui retournera un objet qui utilise le trait. Ensuite, vous pouvez tester les fonctions des traits.

Voici l'exemple de la documentation:

<?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