2011-04-13 8 views
11

que tienen una función (internamente utiliza ASIHTTPRequest) que llama a un bloque con el resultado:Al realizar pruebas unitarias para el objetivo C, ¿cómo se prueban los bloques?

[Http get:@"http://api.geonames.org/postalCodeLookupJSON" 
    params:params cacheMins:0 complete:^(NSDictionary *response, BOOL success) { 
     STAssertTrue(success, @"JSON retrieved OK"); 
     STFail(@"blah"); 
}]; 

Quiero probar lo anterior, pero parece que la prueba no se consiga llamar.

¿Cómo puedo garantizar que la prueba espere hasta que se llame al bloque?

operación -Editar-

Por supuesto no recomiendo hacer esto en la aplicación principal en el hilo GUI, en esta situación particular es sólo para una prueba de unidad.

Respuesta

7

encontrado una solución:

Wait for code to finish execution

Ej:

__block int done=0; 
[Http get:@"http://api.geonames.org/postalCodeLookupJSON" 
    params:params cacheMins:0 complete:^(NSDictionary *response, BOOL success) { 
     STAssertTrue(success, @"JSON retrieved OK"); 
     NSArray *postalcodes = [response objectForKey:@"postalcodes"]; 
     NSDictionary *first = [postalcodes objectAtIndex:0]; 
     NSString *adminName1 = [first objectForKey:@"adminName1"]; 
     STAssertTrue([adminName1 isEqualToString:@"New South Wales"], @"NSW"); 
     done=1; 
}]; 

// https://stackoverflow.com/questions/3615939/wait-for-code-to-finish-execution 
while (!done) { 
    // This executes another run loop. 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    // Sleep 1/100th sec 
    usleep(10000); 
} 
+0

¿Eso dormiría (10) no detendrá el hilo actual (no el hilo que ejecuta el bloque)? Si es el hilo principal desde el que ejecutas el bloque, la suspensión bloqueará la GUI. – Damien

+0

Vaya, lo editaré. Debería ser un "sueño". Y tienes razón, detendrá el hilo principal y detendrá la GUI. Sin embargo, esto es simplemente para una prueba unitaria. – Chris

3
No

seguro donde me encontré con esto, pero hay una manera mejor que no utilice Capacidad:

while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) && !placeMarkUpdated){}; 

aquí está en contexto, probando una solicitud de geocodificación inversa:

__block BOOL placeMarkUpdated = NO; 

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { 
    if (placeMarkUpdated == NO) { 
     placeMarkUpdated = YES; 
     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     address = [Address addressFromPlacemark:placemark]; 
    } 
}]; 

while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) && !placeMarkUpdated){}; 

Capacidad chupan causa que ralentizan la acumulación (sé 5s no suena mal, pero tenga en cuenta la vieja historia: tipo va al médico causar daño a las rodillas de correr, doctor dice 'vamos a la mesa 'y toca su rodilla y dice' ¿te duele? 'tipo dice' no ', doctor:' lo haría si lo hiciera 10K veces ... '

Cuestiones relacionadas