2009-01-29 2 views
7

Je voudrais tester du code avec OCMock.Comment utiliser les objets OCMock avec du code qui s'appelle isKindOfClass?

Les entrailles du code appellent [NSObject isKindOfClass] sur l'objet simulé je fournir au code, comme ceci:

if ([object isKindOfClass:[FancyClass class]]) { ...} 

Cependant, quand je donne un simulacre basé sur OCMockObject créé comme ceci:

mock = [OCMockObject mockForClass:[FancyClass class]]; 

il semble qu'il ne passe pas le test isKindOfClass.

Des suggestions?

+1

Beaucoup de temps a passé depuis que cette question, et il est toujours pertinent. Je ne suis pas d'accord avec la réponse disant que vous ne devriez pas utiliser isKindOfClass mais seulement vérifier le protocole. Il impose "dactylographie" au lieu de polymorphisme pur, ce qui devrait être un style acceptable. Je m'attendrais à ce que OCMock réussisse le test isKindOfClass ... – yonix

Répondre

7

La règle générale est que si vous appelez isKindOfClass: et que vous ne transmettez pas l'une des classes de requête (par exemple, NSString ou NSNumber), vous ne l'utilisez pas correctement.

Si la méthode effectue deux opérations différentes ou plus en fonction de la classe de son argument, déchiffrez-la en plusieurs méthodes et testez chaque méthode séparément.

Si la méthode ne fait qu'une chose, mais doit interagir avec l'objet différemment selon la classe qu'il est, alors:

  1. Faire un protocole. (Les protocoles dans Obj-C sont appelés "interfaces" dans d'autres langages OO, tels que Java.)
  2. Rend toutes les classes conformes au protocole. Si nécessaire, utilisez des catégories pour ajouter les méthodes nécessaires de l'extérieur.
  3. Effectuez la vérification de la méthode pour vérifier la conformité au protocole, à la place de la vérification isKindOfClass: en cours.
  4. Faites en sorte que la méthode test utilise les méthodes du protocole.
+3

La liste des suggestions semble bonne, mais je ne serais pas d'accord sur le fait que l'utilisation de isKindofClass ne devrait prendre que des cours de base. Par exemple, il est très utile de parcourir le tableau chargé via nib et de rechercher le UITableViewCell que vous avez créé ... –

+0

Ne vaudrait-il pas mieux tester ce que vous avez besoin de la cellule plutôt que de savoir où elle réside? la hiérarchie de classe? (Je ne connais pas Cocoa Touch, donc je ne peux pas être plus précis.) –

2

Qu'en est-:

[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL) {YES})] isKindOfClass:[FancyClass class]]; 
+0

Pourriez-vous l'expliquer pour le rendre facilement compréhensible? – Gaim

+0

Ce code, en anglais dit: "chaque fois que cet objet (faux) est envoyé le message isKindOfClass avec l'argument [classe FancyClass], il suffit de retourner YES". En d'autres termes, tromper tout le monde en prétendant être une instance de FancyClass. –

+0

Vous pouvez utiliser [mock stub] pour que l'objet renvoie des éléments spécifiques à partir de n'importe quelle méthode, ce qui est utile pour créer des scénarios de test et isoler le code exercé de certaines dépendances. –

Questions connexes