2012-01-19 2 views
0

J'ai le code de test Objective C suivant dans une classe SenTestCase. Je n'obtiens aucune erreur, mais la méthode httpReceiveDataFinished n'est jamais appelée. Est-ce parce que le test est terminé avant que le délégué ait la possibilité de traiter la méthode http?Comment puis-je demander à la méthode de test d'attendre la fin du traitement du délégué?

Si c'est le cas, comment puis-je faire tourner un thread (ou quelque chose de similaire) pour faire attendre le test pendant quelques secondes?

Merci mille fois pour toute aide. J'ai programmé Java pendant des années, mais Objective-C seulement quelques jours.

- (void)testExample 
{ 
    HttpClient *client = [[HttpClient alloc] init]; 
    client.method = METHOD_GET; 
    client.followRedirects = YES; 
    [client processRequest:@"http://google.com" delegate:self]; 
    NSLog(@"Test Over"); 
} 

-(void) httpReceiveError:(NSError*)error { 
    NSLog(@"***\n%@\n***",[error description]); 
} 

- (void) httpReceiveDataChunk:(NSData *)data { 
    [self.httpResponseData appendData:data]; 
} 

-(void) httpReceiveDataFinished { 
    NSString *result = [[NSString alloc] 
     initWithData:self.httpResponseData 
     encoding:NSUTF8StringEncoding]; 
    NSLog(@"***\nRESULT: %@ \n***",result); 
} 
+2

http://stackoverflow.com/questions/1077737/ocunit-test-for-protocols-callbacks-delegate-in-objective-c –

+0

génial. travaillé comme un charme. –

Répondre

0

Premièrement: le lien de Stanislav est excellent. Pour ma part, j'avais besoin de quelque chose de plus flexible (courir pendant de longues durées) mais qui passerait aussi le test immédiatement en cas de succès. (. téléchargements de fichiers volumineux et similaires)

Voici ma fonction utilitaire:

-(BOOL)runLooperDooper:(NSTimeInterval)timeoutInSeconds 
     optionalTestName:(NSString *)testName 
{ 
    NSDate* giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; 
    // loop until the operation completes and sets stopRunLoop = TRUE 
    // or until the timeout has expired 

    while (!stopRunLoop && [giveUpDate timeIntervalSinceNow] > 0) 
    { 
     // run the current run loop for 1.0 second(s) to give the operation code a chance to work 
     NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:1.0]; 
     [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; 
    } 

    STAssertTrue(stopRunLoop, 
       @"%@ failed to finish before runloop expired after %f seconds", testName, timeoutInSeconds); 
    return stopRunLoop; 
} 

Déclare stopRunLoop comme Ivar dans votre testeur de classe. Assurez-vous de réinitialiser stopRunLoop à FALSE dans votre fonction setUp, et appelez cette fonction avant d'appeler votre [client processRequest:@"http://google.com" delegate:self]; Ensuite, dans vos gestionnaires d'événements, définissez stopRunLoop sur TRUE. En lui passant un testName, vous pouvez le réutiliser pour plusieurs tests et obtenir des messages d'erreur significatifs.

Éditer: 99% de certitude J'ai basé le code ci-dessus sur un autre post de StackOverflow que je ne trouve pas pour le moment, ou je le lierais.

Questions connexes