Buenas,
Sobre lo de los tests de unidad, por qué no me convencía ninguna solución. Es porque los que he visto, para soportar el asincronismo, hacen lo siguiente:
- (BOOL)waitForCompletion:(NSTimeInterval)timeoutSecs {
NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeoutSecs];
do {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeoutDate];
if([timeoutDate timeIntervalSinceNow] < 0.0)
break;
} while (!done);
return done;
}
Lo cual me parece una chapuza. Inspirado en mocha, el framework que uso para nodejs, la solución mía pasa por pasar un bloque (función callback en mocha) que tú tienes que llamar para decir cuándo has terminado. Y ese bloque lo puedes llamar desde donde quieras. Desde dentro de otro bloque que se ejecutará asíncronamente por ejemplo. Es decir… (en pseudocódigo)
funcion test(done) {
hacerAlgoAsíncrono(parametros, {
// una vez terminado
done(); // le indica al framework que el test ha terminado, y que ejecute los siguientes tests si hay
})
}