J'apprécie le fait que cette question a été posée et a répondu à près d'un an, mais je ne peux pas aider mais être en désaccord avec les réponses données. Les tests des opérations asynchrones, en particulier les opérations de réseau, est un très commun, et est important pour obtenir le droit. Dans l'exemple donné, si vous dépendez du réseau réel des réponses de vous faire perdre de la valeur importante de vos tests. Plus précisément, vos tests de devenir dépendant de la disponibilité et de la correction fonctionnelle du serveur que vous êtes en communication avec; cette dépendance rend vos tests
- de plus en plus fragile (ce qui se passe si le serveur tombe en panne?)
- moins complet (comment voulez-vous systématiquement le test d'une réponse en cas d'échec ou d'erreur de réseau?)
- significativement plus lent imaginer de tester ce:
Les tests unitaires doivent exécuter en une fraction de seconde. Si vous devez attendre pour un multi-deuxième réponse du réseau à chaque fois que vous exécutez vos tests, alors vous êtes moins susceptibles de les exécuter fréquemment.
Le test unitaire est en grande partie sur l'encapsulation des dépendances; du point de vue de votre code à tester, il se passe deux choses:
- Votre méthode déclenche une demande du réseau, probablement par l'instanciation d'un NSURLConnection.
- Le délégué vous avez spécifié reçoit une réponse par l'intermédiaire de certains appels de méthode.
Votre délégué n'est pas, ou ne devrait pas, de soins où la réponse est venue, qu'il s'agisse d'une réponse réelle à partir d'un serveur distant ou à partir de votre code de test. Vous pouvez en profiter pour tester les opérations asynchrones par le simple fait de produire les réponses vous-même. Vos tests s'exécute beaucoup plus rapidement, et vous pouvez de manière fiable test de la réussite ou de l'échec des réponses.
Ce n'est pas dire que vous ne devriez pas exécuter des tests à l'encontre de la véritable service web que vous travaillez avec, mais ce sont les tests d'intégration et appartiennent à leur propre suite de tests. Les échecs dans la suite peut signifier que le service web a des changements, ou simplement vers le bas. Car ils sont plus fragiles, l'automatisation de leur tendance à avoir moins de valeur que l'automatisation des tests unitaires.
Concernant exactement comment aller sur les tests asynchrones réponses à une demande du réseau, vous avez quelques options. Vous pourriez tout simplement tester le délégué à l'isolement en appelant les méthodes directement (par exemple, [someDelegate connexion:connexion didReceiveResponse:someResponse]). Cela fonctionne un peu, mais un peu de mal. Le délégué de votre objet fournit peut-être juste un de plusieurs objets dans la déléguée de la chaîne pour un NSURLConnection objet; si vous appelez votre délégué des méthodes directement, vous pouvez manquer de certains élément clé de la fonctionnalité fournie par un autre délégué, en aval de la chaîne. Comme une meilleure alternative, vous pouvez talon la NSURLConnection objet de créer et de rediriger les messages de réponse à l'ensemble de son délégué de la chaîne. Il y a des bibliothèques qui va rouvrir NSURLConnection (parmi d'autres classes) et de le faire pour vous. Par exemple: https://github.com/pivotal/PivotalCoreKit/blob/master/SpecHelperLib/Extensions/NSURLConnection%2BSpec.m