2013-05-08 3 views
2

Je suis en train de tester un wrapper sur une API avec PHPUnit (CLI). En raison de la nature des tests, je peux pratiquement utiliser le même code pour tester deux cas d'utilisation différents. La seule différence est dans les valeurs que j'envoie à l'API en tant que paramètres. J'ai donc décidé d'écrire une classe DefaultTest, où je teste l'API en utilisant les valeurs par défaut utilisées par l'API et une seconde CustomTest (Case) où je teste mon conteneur de paramètres avec des valeurs différentes. CustomTest hérite de DefaultTest, car toutes les fonctions utilisées pour valider les données retournées sont équivalentes dans les deux cas.Phpunit n'exécute pas de cas de test parent efficace?

est ici un code pour votre compréhension:

class DefaultTest extends PHPUnit_Framework_TestCase { 

    public function testAPIMethod() 
    { 
     $this->checkParameterContainer(); 
     $this->validateResults(); 
    } 

    public function checkParameterContainer() 
    { 
     /* Set up default parameter container */ 
    } 

    public function validateResults() 
    { 
     /* Validate the results */ 
    } 
} 

class CustomTest extends DefaultTest { 

    public function checkParameterContainer() 
    { 
     /* Set up custom parameter container */ 
    } 

    public function validateResults() 
    { 
     parent::validateResult(); 
    } 
} 

PHPUnit prend la classe enfant, exécute le testAPIMethod, conduisant à CustomTest :: checkParameterContainer() et DefaultTest :: validateResults() en cours d'exécution.

Mais le testAPIMethod de DefaultTest n'est jamais exécuté, car DefaultTest :: checkParameterContainer() n'est jamais appelé.

Les deux classes sont entièrement valides. TestCases et DefaultTest sont exécutés normalement lorsqu'ils ne sont pas spécialisés.

Alors, ma question pour vous les gars: Pourquoi est-ce? Est-ce que quelque chose me manque? Est-ce par conception?

+0

Il semble que seules les fonctions publiques sont appelées de par leur conception. – Adder

+0

Argh ... Correction de mon code d'exemple (encore ...) Toutes les fonctions sont réellement publiques. – PvB

+2

Pourquoi faites-vous deux classes pour différents cas de test plutôt que d'utiliser un fournisseur de données avec les différentes données pour chacun? Puisque les données sont la seule chose qui change, vous pouvez réutiliser le code complètement. – Schleis

Répondre

0

Dans le cas, quelqu'un en a besoin: PHPUnit utilise la réflexion pour trouver des méthodes de test sur chaque classe, mais ne cherchera pas dans les classes parentes. Les éléments suivants seront donc nécessaires dans la classe de test enfant:

public function testAPIMethod() 
{ 
    parent::testAPIMethod(); 
} 
+0

Merci pour votre réponse. Je ne serai pas en mesure de le confirmer car le projet a été terminé il y a un certain temps. Est-ce que quelqu'un d'autre peut confirmer ce fait afin que je puisse cocher ceci comme réponse correcte? – PvB