2011-03-23 1 views
2

Je sais que trois approches:Quelle technique devrait être utilisée pour tester la fonctionnalité de classe abstraite dans PHPUnit?

  1. Créez sous-classe faux (semble laid)
  2. test l'une des sous-classes réelles
  3. Utilisez getMockForAbstractClass() (contredit la mission de simulacres, aussi ne peut pas bouchonner non abstraite méthodes)

Quelle est la meilleure façon selon le concept de test unitaire?

+1

Gordons répond à peu près résume mon point aussi, donc je vais juste ajouter un commentaire. Je teste tout dans la classe de base qui ne repose pas sur les méthodes abstraites à exister dans la classe abstraite et le reste dans les classes de base. Alors que l'on pourrait argumenter qu'il n'est pas nécessaire de tester la classe de base du tout et tester uniquement les classes dérivées (peut-être avec une classe de test de base;)?) La plupart du temps ne vaut pas le tracas. Donc j'irais 4 "Test toutes les sous-classes et les fonctions incluses dans le baseclass seulement une fois" – edorian

Répondre

4

Je ne rédigerais que des tests pour des classes concrètes dérivées de la classe abstraite. Si vous trouvez que vous dupliquez des tests parmi eux, écrivez une superclasse et déplacez les tests dupliqués là ou utilisez la classe getMockForAbstract pour ceux-ci.

Donc, si vous aviez quelque chose comme ceci:

abstract class Employee 
{ 
    protected $name; 
    public function getName() 
    { 
     return $this->name; 
    } 
    abstract function doWork(); 
    … 
} 

class Mechanic extends Employee 
{ 
    public function doWork() 
    { 
     return // specific to Mechanic 
    } 
} 

class Engineer extends Employee 
{ 
    public function doWork() 
    { 
     return // specific to Engineer 
    } 
} 

j'aurais une classe de test pour tester mécanicien et ingénieur leur mise en œuvre doWork, mais pas leur fonctionnalité getName, parce que cela est héritée par la classe abstraite. Pour cela, j'écrire une classe puis personnalisée ou utiliser getMockForAbstractClass, comme le montre l'exemple dans le Manuel de PHPUnit:

1

Cela dépend de la classe fonctionnelle abstraite est. Lorsque la classe abstraite est simplement là pour fournir un certain nombre de méthodes types, je limite mes tests aux sous-classes concrètes.

Lorsque la classe abstraite est pour la plupart terminée, je vais soit créer une sous-classe concrète pour le test dans le même fichier que le cas de test, soit utiliser un simulacre. Notez que getMockForAbstractClass() est juste un assistant qui trouve toutes les méthodes abstraites pour vous. Rien ne vous empêche de déclarer toutes les méthodes abstraites plus quelques unes concrètes avec getMock(). Pour cette raison, je substitue getMock() dans notre cas de test de base pour fusionner dans toutes les méthodes abstraites avant d'appeler le parent.

Questions connexes