Question

Au risque d'être flambé ... Quel sont les avantages l'application des appels aux méthodes plutôt que les fonctions ont dans un contexte où le contexte est implicite.

Considérant que la syntaxe de PHP est si laid pour appeler des méthodes pourquoi les créateurs de PHPUnit ont imposé son utilisation?

Si le cadre avait fixé un objet global « currentTestCase » et a échoué associé de manière transparente avec cet objet affirme que nous pourrions par écrit:

assertEquals("blah", $text);

par opposition à l'équivalent, mais bavard:

$this->assertEquals("blah", $text);

Qu'est-ce exactement que nous obtenons en utilisant OO dans ce contexte.

S'il vous plaît me éclairer.

Était-ce utile?

La solution

Parce que PHPUnit est dérivé de xUnit et qui est COMMEnT xUnit il.

Pourquoi xUnit faire de cette façon? Je suis heureux que vous ayez demandé. La raison initiale, comme Robert souligne, est que xUnit vient de Smalltalk et a été popularisé par JUnit en Java. Les deux sont des langues OO ou rien donc ils avaient pas le choix.

Cela ne veut pas dire qu'il n'y a pas d'autres avantages. tests OO peuvent être hérités. Cela signifie que si vous voulez tester une sous-classe vous pouvez exécuter tous les tests du parent et simplement remplacer la poignée de méthodes d'essai pour les comportements que vous avez changé. Cela vous donne une excellente couverture des sous-classes sans avoir à dupliquer le code de test.

Il est facile d'ajouter et de remplacer les méthodes assert dans PHPUnit. Juste sous-classe PHPUnit_Framework_TestCase, écrire vos propres méthodes de assert et ont vos cours de test héritent de votre nouvelle sous-classe. Vous pouvez également écrire des méthodes par défaut setup et teardown.

Enfin, il garantit que les méthodes de cadre de test ne vont pas entrer en conflit avec la chose qu'ils testent. Si le cadre de test juste jeté ses fonctions dans le test et que vous vouliez tester quelque chose qui avait une méthode de setup ... eh bien vous êtes en difficulté.

Cela dit, j'entends votre douleur. Un grand cadre de test peut être gênant et encombrant et fragile. Perl n'utilise pas un style xUnit, il utilise un style de procédure avec les noms de fonctions de test court. Voir Test :: Plus pour un exemple. Dans les coulisses, il fait exactement ce que vous avez dit, il y a un objet instance de test singleton qui utilisent toutes les fonctions. Il y a aussi une fonction assert procédure hybride avec module méthodes d'essai OO appelé qui fait le meilleur des deux mondes.

  

Considérant que la syntaxe de PHP est si laid pour appeler les méthodes

Je suppose que vous ne l'aimez pas le ->. Je vous suggère d'apprendre à vivre avec elle. OO PHP est tellement mieux que l'alternative.

Autres conseils

Une bonne raison est que assertXXX comme nom de la méthode présente un risque élevé pour nommer affrontement.

Un autre est qu'il est dérivé du xUnit famille, qui traite généralement des langages orientés objet - Smalltalk initialement. Cela rend plus facile de vous lié à vos « frères et sœurs » de par exemple Java et Ruby.

Avoir les cas de test dans les méthodes de classe arrêts de travail pour PHPUnit. En raison du manque de PHPUnit intelligence intégrée ne pouvait trouver ou gérer des fonctions de test pures. Seul avoir à reconnaître le -> ASSERTmd () messages -dans un booléen simple, enregistre à nouveau la logique à chaîne de traitement (pour PHPUnit, pas le cas test de l'auteur). Il est tout le sel syntaxique qui permet d'économiser les frais généraux du point de vue PHPUnit / SimpleTest.

Il ne serait pas un problème technique pour capturer l'erreur / messages d'avertissement, des exceptions ou de reconnaître la déclaration phps assert native (). Il ne se fait pas parce qu'une API difficile ressemble plus enterprisey.

scroll top