les tests unitaires et les méthodes Statiques
De la lecture et de ramasser sur les tests unitaires, en essayant de donner un sens à le post suivant sur qui explique les difficultés de la statique des appels de fonction.
Je n'ai pas de comprendre clairement ce problème. J'ai toujours assumé les fonctions statiques ont été une belle façon d'arrondir les fonctions de l'utilitaire dans une classe. Par exemple, j'ai souvent utiliser des appels de fonctions pour initialiser, c'est à dire:
Init::loadConfig('settings.php');
Init::setErrorHandler(APP_MODE);
Init::loggingMode(APP_MODE);
//start loading app related objects ..
$app = new App();
//Après avoir lu le post, j'ai maintenant l'objectif de ce lieu ...
$init = new Init();
$init->loadConfig('settings.php');
$init->loggingMode(APP_MODE);
//etc ...
Mais, les quelques dizaines de tests que j'avais écrit pour cette classe sont les mêmes. J'ai rien changé et qu'ils passent tous. Suis-je en train de faire quelque chose de mal?
De l'auteur du post est la suivante:
La base, une question avec des méthodes statiques, c'est qu'ils sont le code de procédure. Je n'ai aucune idée de comment l'unité-test code de procédure. Tests unitaires suppose que je peux instancier un morceau de mon application dans l'isolement. Lors de l'instanciation I fil des dépendances avec des objets fantaisie/matches amicaux, qui remplacent les dépendances réels. Avec la procédure de programmation: il n'y a rien de “fil” car il n'y a pas d'objets, le code et les données sont séparées.
Maintenant, je comprends bien le post que des méthodes statiques de créer des dépendances, mais ne pas comprendre intuitivement pourquoi on ne peut pas tester la valeur de retour d'une méthode statique, comme une méthode régulière?
Je vais être en évitant les méthodes statiques, mais je serais bien aimé avoir une idée de QUAND les méthodes statiques sont utiles, voire pas du tout. Il semble de ce post méthodes statiques sont à peu près aussi mal que les variables globales et doivent être évités autant que possible.
Toute information supplémentaire ou des liens sur le sujet serait grandement apprécié.
Vous devez vous connecter pour publier un commentaire.
Méthodes statiques eux-mêmes ne sont pas plus difficiles à tester que les méthodes d'instance. Le problème se pose lorsqu'une méthode statique ou autrement-les appels autres méthodes statiques parce que vous ne peut pas isoler la méthode testée. Voici un exemple typique de la méthode qui peut être difficile à tester:
Ce qui pourrait vous voulez tester avec cette méthode?
InvalidIdentifierException
.Database::query()
reçoit le bon identifiant.null
lorsqu'il n'est pas.Ces exigences sont simples, mais vous devez également configurer la journalisation, de se connecter à une base de données, charger des données, etc. Le
Database
classe devrait être le seul responsable de l'essai qu'il peut se connecter et de requête. LeLog
classe devrait faire de même pour la journalisation.findUser()
ne devraient pas avoir à faire face à tout cela, mais il se doit car il dépend d'eux.Si, au contraire, la méthode ci-dessus, fait des appels à des méthodes d'instance sur
Database
etLog
cas, le test pourrait passer dans les objets fantaisie avec des scripts retour des valeurs spécifiques pour le test à la main.Le test ci-dessus échoue si
findUser()
manque à l'appelconnect()
, passe la mauvaise valeur pour$id
(5
ci-dessus), ou renvoie autre chose quenull
. La beauté, c'est qu'aucune base de données est en cause, ce test est rapide et robuste, le sens de ne pas échouer pour des raisons sans rapport avec le test comme une défaillance du réseau ou de mauvais échantillon de données. Il vous permet de vous concentrer sur ce qui compte vraiment: la fonctionnalité contenue dansfindUser()
.PHPUnit_Framework_Assert
quiTestCase
hérite. Alors que PHP vous permet d'appeler des méthodes statiques à l'aide de->
,self::
est plus courte et de plus correct.$c = Foo::class; $m = 'bar'; $c::$m();
(run)—vous pouvez obtenir le même effet.Sebastian Bergmann d'accord avec Misko Hevery et des citations de lui souvent:
Le principal problème avec les méthodes statiques, c'est qu'ils introduisent de couplage, généralement par le coder en dur la dépendance dans votre consommation de code, ce qui rend difficile de les remplacer avec des talons ou des simulacres de votre Appareil-Tests. Cela viole le Ouvert/Fermé Principe et la Inversion De Dépendance Principe, deux des De SOLIDES principes.
Vous avez absolument raison,la statique sont considérées comme nuisibles. Les éviter.
De vérifier les liens pour plus d'informations s'il vous plaît.
Mise à jour: notez que, lors de la statique sont toujours considérés comme des nuisibles, la capacité de tampon et de se moquer de méthodes statiques a été retiré de PHPUnit 4.0
Je ne vois pas de problème lors de l'essai de méthodes statiques (au moins aucun qui n'existe pas dans la non-méthodes statiques).
include_path
.