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 :

Pochette du livre Qualité logicielle pour les développeurs

Si ce blog vous plaît, vous trouverez de nombreux conseils pratiques dans mon livre. C'est une bonne manière de me soutenir et de m'encourager

Qualité logicielle pour les développeurs

Le livre qui vous aide à améliorer la qualité de vos projets.

  • ✅ Comment mettre en place des tests automatisés pérennes ;
  • ✅ Comment analyser la qualité de votre code ;
  • ✅ Faites adhérer votre équipe à la qualité logicielle.
blog comments powered by Disqus

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