1

Dans un projet que je travaille, j'ai implémenté l'exemple HTTP Manager Reachability.Echec de la surveillance avec AFNetworking dans le test unitaire

Quand je lance l'application réelle , il va à l'intérieur du bloc et de là au commutateur:

[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
switch (status) { 

En outre, quand je l'appelle ...reachabilityManager] isReachable méthode renvoie true comme prévu.

Le problème se produit lorsque je tente de test unitaire une méthode de classe, j'ai écrit que les utilisations ...reachabilityManager] isReachable comme une condition préalable - il retourne faux et ce qui est bizarre que lors d'un débogage je l'ai remarqué qu'il ne va pas à l'intérieur ce qui précède bloc, il le saute.

Bien sûr, dans l'application réelle, il va à l'intérieur du bloc.

J'ai même essayé de se moquer de la classe qui implémente l'exemple HTTP Manager joignabilité utilisant OCMock dans le test unitaire, mais il m'a donné le même résultat:

// NetworkClass implements the example 
NetworkClass *networkClass = [[NetworkClass alloc] init]; 
id mockedNetworkClass = OCMPartialMock(networkClass); 
// startNetworkMonitoring method implements the whole example above 
[mockedNetworkClass startNetworkMonitoring]; 
// Giving enough time for AFNetworking to finish 
[NSThread sleepForTimeInterval:60.0f]; 

EDIT1:

Ressemble sémaphore/XCTestExpectation ne va pas aider, le problème est en AFNetworkReachabilityManager :: startMonitoring:

  • La seule façon que nous pourrions obtenir le rappel que nous voulons est à l'intérieur méthode startMonitoring à dispatch_async(dispatch_get_main_queue(), ^{ callback(status);

Mais il fonctionne en dehors du test unitaire, même si nous utilisons sémaphores/XCTestExpectation comme mentionné.

Toujours à la recherche soultions ..

EDIT2:

je tentais de suivre le objc.io pour tester le code asynchrone mais il semble manquer un peu de code et quelques-unes des explications manquent des détails d'intégration.

+0

Je ne suis pas sûr de ce que vous réessayer de tester, mais peut-être que vous pourriez capturer le bloc de changement d'état et l'exécuter avec différents paramètres pour différents cas de test. Cela aurait-il un sens pour vous? –

+0

En fait non. Comme je l'ai écrit, j'essaie de tester une méthode qui fait quelque chose mais la condition préalable à cette méthode est la méthode isReachable et c'est le problème. – OhadM

+0

Et si vous vous moquez de 'manager.reachabilityManager' et stub la méthode' isReachable' pour retourner YES toujours.Cela vous permettrait de faire vos tests. Notez qu'en utilisant réellement l'objet Reachability, vous introduisez une dépendance dans votre test. –

Répondre

1

J'imagine que dormir le fil pose des problèmes. Essayez d'utiliser l'API d'attentes documentée dans Writing Tests of Asynchronous Operations.

Quelque chose le long des lignes de ce qui devrait vous aider à démarrer (noter que ceci est plus une démonstration de l'attente API plutôt que d'un cas de test de travail complet):

- (void)testReachability { 
    XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for reachability"]; 

    [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
     ... 

     [expectation fulfill]; 

    }]; 

    [self waitForExpectationsWithTimeout:10 handler:^(NSError * _Nullable error) { 
     // timed out waiting for reachability 
    }]; 
} 
+0

Merci pour le respond.I essayé et il échoue. En outre, j'ai essayé d'utiliser le sémaphore qui est le même que XCTestExpectation et il échoue également. Il n'entre jamais dans le bloc - gardez à l'esprit que pendant le débogage, j'ai regardé l'objet basicNetwork et il a été entièrement initialisé avec la bonne URL. – OhadM

+0

Je pense que j'ai trouvé le problème, en exécutant l'application réelle le premier appel qui atteint setReachabilityStatusChangeBlock NE va pas dans le bloc, seulement sur le 2ème appel (qui est un rappel par AFNetworking) il va à l'intérieur du bloc. La question est maintenant de savoir comment activer ce rappel (à l'intérieur du test unitaire) alors que le test unitaire est réellement synchrone ... – OhadM