Meilleures pratiques pour tester les méthodes protégées avec PHPUnit (sur les classes abstraites)
Avec PHPUnit et PHP >= 5.3 il est possible de tester les méthodes protected. La page suivante à stackoverflow décrit les meilleures pratiques sur:
"Les meilleures pratiques pour tester les méthodes protected avec PHPUnit"
protected static function callProtectedMethod($name, $classname, $params) {
$class = new ReflectionClass($classname);
$method = $class->getMethod($name);
$method->setAccessible(true);
$obj = new $classname($params);
return $method->invokeArgs($obj, $params);
}
Pour tester les méthodes publiques sur les classes abstraites est facile avec PHPUnit.
Pour tester les méthodes protected sur les classes normales est facile avec l'approche ci-dessus.
Pour tester les méthodes protected sur les classes abstraites doit être possible en quelque sorte...
Je sais PHPUnit tire les classes abstraites et "met en œuvre" méthodes abstraites dans une classe concrète des incendies et les tests contre le béton de la classe mais je ne sais pas comment faire pour l'intégrer dans l'approche ci-dessus pour un callProtectedMethodOnAbstractClasses().
Comment allez-vous faire de tels tests?
PS: La question n'est PAS sur la vérité de tester les méthodes protected (voir: blanc-gris - et blackbox-test). La nécessité de tester les méthodes protected dépend de votre stratégie de test.
source d'informationauteur Daniela Waranie
Vous devez vous connecter pour publier un commentaire.
Puisque vous demandez une "meilleure pratique" je vais prendre une approche différente de la réponse:
Ne teste pas les méthodes protégées et privées
Juste parce que vous pouvez ne signifie pas que vous devriez.
Vous voulez tester qu'une classe fonctionne. Cela signifie que toutes les fonctions que vous pouvez appeler sur (tout public) retour de la droite des valeurs (et peut-être appeler le droit de fonctions sur les objets passés) et rien d'autre.
Vous ne se soucient pas comment cela est mis en œuvre dans la classe.
À mon humble avis il est même mal à l'écriture de test pour rien non publique pour deux grandes raisons:
Essais d'écriture prend plus de temps que vous avez besoin de plus et de refactoring prend également plus de temps. Si vous vous déplacez autour de code dans une classe, sans changer son comportement vous shoudn est pas nécessaire de mettre à jour ses tests. Les essais doivent vous dire que tout fonctionne toujours!
Si vous écrivez un essai pour chaque méthode protégée, vous perdez une hériter de bénéficier du rapport de couverture de code: Il ne sera pas vous dire ce qui protégé les fonctions ne sont pas appeler plus. C'est (à mon humble avis) une mauvaise chose parce que vous n'avez pas de tester toutes les méthodes publiques correctement (pourquoi est-il une méthode qui n'est pas appelée si vous testez tous les cas?) ou vous avez vraiment n'avez pas besoin de cette méthode plus mais puisque c'est "verte", vous ne lui donnez pas une seconde pensée.
Pour citer le PHPUnit Auteur
http://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html
Depuis le monde réel diffère parfois
...->setAccessible()
est très bien pour les méthodes normalespour les choses abstraites utilisation
...->getMockForAbstractClass()
Mais s'il vous plaît le faire que si elle est vraiment nécessaire.
Une méthode protégée dans une classe abstraite va être testé par le test de l'api publique de ses enfants, de toute façon avec mes arguments à partir de ci-dessus l'application.
Hypothèse: Vous voulez l'appeler béton protégé méthodes d'une classe abstraite.
Créer une maquette de l'objet pour la classe abstraite, et de le passer à cette forme modifiée de
callProtectedMethod()
.Vous pourriez encapsuler ce dans une seule méthode, mais je préfère passer à l'objet de façon à ce qu'un test peut appeler plusieurs protected/private méthodes sur le même objet. Pour ce faire, utilisez
$class->isAbstract()
décider de la manière de construire l'objet.