2013-08-21 4 views
30

J'utilise GHUnit. Je veux tester des méthodes privées et je ne sais pas comment les tester. J'ai trouvé beaucoup de réponses sur pourquoi ou pourquoi ne pas tester des méthodes privées. Mais n'a pas trouvé sur la façon de les tester.Méthode privée de test unitaire - objectif C

Je ne voudrais pas discuter si je devrais tester les privés ou non, mais je me concentrerai sur la façon de le tester.

Quelqu'un peut-il me donner un exemple de la façon de tester la méthode privée?

+0

De la même façon que vous tester une méthode normale, quel est le problème que vous rencontrez exactement? – Abizern

+0

La décision de tester des méthodes privées fait partie de l'espace de problème et non de l'espace de solution. – dasblinkenlight

+0

@Abizern Il dit 'Non @interface visible myClass déclare le sélecteur « myMethod'' – Geek

Répondre

86

Les méthodes d'Objective-C ne sont pas vraiment privées. Le message d'erreur que vous obtenez est que le compilateur ne peut pas vérifier que la méthode que vous appelez existe car elle n'est pas déclarée dans l'interface publique.

Le moyen de contourner ce problème est d'exposer les méthodes privées dans une catégorie de classe, ce qui indique au compilateur que les méthodes existent.

donc ajouter quelque chose comme ça en haut de votre dossier de test:

@interface SUTClass (Testing) 

- (void)somePrivateMethodInYourClass; 

@end 

SUTClass est le nom réel de la classe que vous écrivez des tests pour. Cela rendra votre méthode privée visible, et vous pouvez le tester sans les avertissements du compilateur.

+0

Mais cela exposera ces méthodes. – Geek

+4

Si vous le faites dans votre classe de test, vous n'exposez que les méthodes pour les tests. – Abizern

+0

Mais vous avez dit que j'ai écrit ceci dans la classe que je suis en train de tester, pas en classe de test. – Geek

3

Si une méthode est privée, vous ne devriez jamais la tester.

Pensez-y. Vous devriez tester le comportement et le contrat de vos méthodes à la place de la mise en œuvre interne

+1

Donc ... Si nous avions une implémentation interne qui nécessitait un test, cela indique-t-il un défaut de conception dans lequel cette méthode aurait dû être écrite en public dans une autre classe, qui doit être cachée en privé dans la classe initiale? – Mazyod

+2

Si ce n'est pas le cas, alors (superficiellement) faire une application entière dans une seule classe avec des méthodes privées ne devrait pas être testé. – Mazyod

+0

parfait Mazyod, je suis complètement d'accord avec vos informations supplémentaires – seufagner

7

Un peu en retard, mais je viens de monter dans le train TDD.

Les méthodes privées ne doivent pas être testées. Parce que vous écrivez des méthodes privées pour soutenir vos méthodes publiques, tester vos méthodes publiques indirectement teste indirectement les méthodes privées qui les supportent. Le principe "les méthodes privées ne doivent pas être testées" est supporté par le principe "lorsque vous devez tester des méthodes privées, cela signifie probablement que vous devriez déplacer ces méthodes dans la classe séparée" ", les rendant ainsi publiques .

+9

Donc ce n'est pas TDD alors si vous avez écrit un morceau de code sans écrire le test unitaire en premier. Cependant, disons que votre méthode publique utilise peu de méthodes privées, quand elle échoue, comment savez-vous laquelle a échoué? –

4

était d'accord avec @Lord Zsolt

également s'il vous plaît noter à côté (de Test-Driven iOS Development ISBN-10: 0-321-77418-3, ISBN-13: 978-0-321-77418-7)

méthodes d'essai privées

On m'a souvent demandé: « dois-je tester mes méthodes privées? » ou la question connexe: « Comment dois-je tester mes méthodes privées? » les gens demandent à la deuxième question ont supposé que la répondre La première est "Oui" et cherche maintenant un moyen d'exposer les interfaces privées de leurs classes dans leurs suites de tests.

Ma réponse repose sur l'observation d'un fait subtil: Vous avez déjà testé vos méthodes privées. En suivant l'approche red-green-refactor commun dans le développement piloté par les tests, vous avez conçu les API publiques de vos objets pour effectuer le travail que ces objets doivent effectuer.Avec ce travail spécifié par les tests-et l'exécution continue des tests que vous assurant que vous ne violez rien-vous êtes libre d'organiser la plomberie interne de vos classes comme bon vous semble. Vos méthodes privées sont déjà testées parce que tout ce que vous faites est un comportement refactorisation que vous avez déjà des tests pour.

Vous ne devriez jamais se retrouver dans une situation où une méthode privée est non testé ou incomplètement testé, parce que vous les créez que lorsque vous voyez une occasion de nettoyer la mise en œuvre des méthodes publiques. Cela garantit que les méthodes pri- vées existent seulement pour soutenir le comportement du public de la classe, et que ils doivent être invoqué au cours des essais, car ils sont sans aucun doute être appelés des méthodes publiques.

Questions connexes