Comment tester les méthodes concrètes d'une classe abstraite avec PHPUnit?
Je m'attendrais à devoir créer une sorte d'objet dans le cadre du test. Cependant, je n'ai aucune idée de la meilleure pratique pour cela ou si PHPUnit le permet.
Comment tester les méthodes concrètes d'une classe abstraite avec PHPUnit?
Je m'attendrais à devoir créer une sorte d'objet dans le cadre du test. Cependant, je n'ai aucune idée de la meilleure pratique pour cela ou si PHPUnit le permet.
Réponses:
Le test unitaire des classes abstraites ne signifie pas nécessairement tester l'interface, car les classes abstraites peuvent avoir des méthodes concrètes, et ces méthodes concrètes peuvent être testées.
Il n'est pas si rare, lors de l'écriture de code de bibliothèque, d'avoir une classe de base que vous prévoyez d'étendre dans votre couche d'application. Et si vous voulez vous assurer que le code de la bibliothèque est testé, vous avez besoin de moyens pour UT les méthodes concrètes des classes abstraites.
Personnellement, j'utilise PHPUnit, et il a ce qu'on appelle des stubs et des objets simulés pour vous aider à tester ce genre de choses.
Directement à partir du manuel PHPUnit :
L'objet simulé vous donne plusieurs choses:
la source
C'est une bonne question. J'ai cherché ça aussi.
Heureusement, PHPUnit a déjà une
getMockForAbstractClass()
méthode pour ce cas, par exempleImportant:
Notez que cela nécessite PHPUnit> 3.5.4. Il y avait un bogue dans les versions précédentes.
Pour passer à la dernière version:
la source
Il convient de noter que depuis PHP 7, le support des classes anonymes a été ajouté. Cela vous donne un moyen supplémentaire de configurer un test pour une classe abstraite, qui ne dépend pas des fonctionnalités spécifiques à PHPUnit.
la source
Eran, votre méthode devrait fonctionner, mais elle va à l'encontre de la tendance d'écrire le test avant le code réel.
Ce que je suggérerais, c'est d'écrire vos tests sur la fonctionnalité souhaitée d'une sous-classe non abstraite de la classe abstraite en question, puis d'écrire à la fois la classe abstraite et la sous-classe d'implémentation, et enfin d'exécuter le test.
Vos tests doivent évidemment tester les méthodes définies de la classe abstraite, mais toujours via la sous-classe.
la source
La réponse de Nelson est fausse.
Les classes abstraites ne nécessitent pas que toutes leurs méthodes soient abstraites.
Les méthodes implémentées sont celles que nous devons tester.
Ce que vous pouvez faire, c'est créer une fausse classe stub sur le fichier de test unitaire, lui faire étendre la classe abstraite et implémenter uniquement ce qui est requis sans aucune fonctionnalité, bien sûr, et tester cela.
À votre santé.
la source
Si vous ne voulez pas sous-classer la classe abstraite juste pour effectuer un test unitaire sur les méthodes qui sont déjà implémentées dans la classe abstraite, vous pouvez essayer de voir si votre framework vous permet de simuler des classes abstraites.
la source