13/09/2011

Comment tester un Trait avec phpUnit ?

Il peut être intéressant de tester un code avec des Traits, PHP et phpUnit. Les Traits sont apparus en PHP 5.4, et permettent de définir des comportements qui peuvent être réutilisés dans plusieurs classes.

Lors de mes premiers tests, je me suis vite rendu compte d’un problème : pour pouvoir tester un trait, c’est à dire un comportement, il faut une classe qui implémente ce comportement :

trait MyBehavior {
    public function getAny()
    {
        return 'ok';
    }
}

class Example {
    use MyBehavior;
}

Et le test :

class BehaviorTest extends PHPUnit\Framework\TestCase {

    public function testMyBehavior()
    {
        $behavior = new Example;
        $this->assertEquals('ok', $behavior->getAny());
    }
}

Or ici on voit bien l’erreur : on ne test pas unitairement le comportement du Trait, mais son implémentation dans une classe qui est sujette à modifications.

C’est ici qu’intervient PHPUnit, qui a introduit la méthode getObjectForTrait() dans sa version 3.6. Grâce à cette méthode, il est possible de tester directement notre comportement.

trait MyBehavior {
    public function getAny()
    {
        return 'ok';
    }
}

et le test :

class BehaviorTest extends PHPUnit\Framework\TestCase {
    
    public function testMyBehavior() 
    {
        $behavior = $this->getObjectForTrait('MyBehavior');
        $this->assertEquals('ok', $behavior->getAny());
    }
}

Pratique non ?

💡 Pour aller plus loin :

blog comments powered by Disqus

© Jean-François Lépine, 2013 - 2024