J'ai un certain nombre de classes Objective-C organisées dans une hiérarchie d'héritage. Ils partagent tous un parent commun qui implémente tous les comportements partagés entre les enfants. Chaque classe enfant définit quelques méthodes qui le font fonctionner, et la classe parent déclenche une exception pour les méthodes conçues pour être implémentées/remplacées par ses enfants. Cela fait effectivement du parent une classe pseudo-abstraite (car inutile en soi) même si Objective-C ne supporte pas explicitement les classes abstraites. Le point crucial de ce problème est que je teste unitaire cette hiérarchie de classe en utilisant OCUnit, et que les tests sont structurés de manière similaire: une classe de test qui exerce le comportement commun, avec une sous-classe correspondant à chacune des classes enfants testées . Cependant, l'exécution des cas de test sur la classe parent (effectivement abstraite) est problématique, car les tests unitaires échoueront de façon spectaculaire sans les méthodes clés. (L'alternative de répéter les tests communs à travers 5 classes de test n'est pas vraiment une option acceptable.)Comment implémenter ou émuler une classe de test OCUnit "abstraite"?
La solution non idéale que j'ai utilisée est de vérifier (dans chaque méthode de test) si l'instance est le test parent classe, et renflouer si c'est le cas. Cela conduit à un code répété dans chaque méthode de test, un problème qui devient de plus en plus gênant si les tests unitaires sont très granulaires. En outre, tous ces tests sont toujours exécutés et signalés comme des succès, faussant le nombre de tests significatifs qui ont réellement été exécutés.
Ce que je préfère est un moyen de signaler à OCUnit « Ne pas exécuter des tests dans cette classe, ne les exécuter dans ses classes d'enfants. » À ma connaissance, il n'y a pas (encore) un moyen de le faire, quelque chose de similaire à une méthode +(BOOL)isAbstractTest
que je peux implémenter/remplacer. Des idées sur une meilleure façon de résoudre ce problème avec une répétition minimale? Est-ce que OCUnit a la possibilité de marquer une classe de test de cette manière, ou est-il temps de classer un radar?
Edit: Voici un link to the test code in question. Notez la répétition fréquente de if (...) return;
pour démarrer une méthode, y compris l'utilisation de la macro NonConcreteClass()
par souci de concision.
Donc, votre solution non idéale implique de commencer les tests avec quelque chose comme 'if ([self isMemberOfClass: [ParentTest class]]) return;'? –
En gros, oui. J'ai modifié ma question pour inclure un lien vers la classe de test en question. –