13/09/2011

Comment tester un Trait avec phpUnit ?

Il peut être intéressant dès aujourd'hui de tester un code avec des Traits, avec PHP 5.4 (alpha) et phpUnit

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 3.6, qui introduit la méthode getObjectForTrait(). 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 ?

blog comments powered by Disqus