2011-09-05 7 views
5

Estoy probando llamadas de servicios web reales con OCMock.OCMock demorado verificar/ocuparse del tiempo de espera en pruebas unitarias

En este momento estoy haciendo algo como:

- (void)testWebservice 
{ 
    id mydelegatemock = [OCMockObject mockForProtocol:@protocol(MySUTDelegate)]; 
    [[mydelegatemock expect] someMethod:[OCMArg any]]; 

    [SUT sutWithDelegate:mydelegatemock]; 

    // we need to wait for real result 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]]; 

    [(OCMockObject*)mydelegatemock verify]; 
} 

Funciona bien, pero implica que cada una de estas pruebas se llevará a 2 segundos.

¿Existe alguna manera de establecer un tiempo de espera de p. 2 segundos, y deje una llamada a someMethod de mydelegatemock inmediatamente verify y complete el caso de prueba?

Respuesta

5

Puedo hacer esto utilizando una función de utilidad práctica encontré at this link:

#import <Foundation/Foundation.h> 
#import <OCMock/OCMock.h> 

@interface TestUtils : NSObject 
+ (void)waitForVerifiedMock:(OCMockObject *)mock delay:(NSTimeInterval)delay; 
@end 

Y la aplicación:

#import "TestUtils.h" 
@implementation TestUtils 

+ (void)waitForVerifiedMock:(OCMockObject *)inMock delay:(NSTimeInterval)inDelay 
{ 
    NSTimeInterval i = 0; 
    while (i < inDelay) 
    { 
     @try 
     { 
      [inMock verify]; 
      return; 
     } 
     @catch (NSException *e) {} 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
     i+=0.5; 
    } 
    [inMock verify]; 
} 

@end 

Esto me permite a esperar hasta un tiempo máximo (en segundos) y sin esperando la cantidad completa cada vez.

+2

Tal vez se originó aquí? ... http://touchalicious.com/blog/2009/11/5/asynchronous-unit-testing-with-ocmock.html –

+1

Gracias Max: parece la fuente. Actualicé la respuesta original con un enlace al original. –

1

Yo separaría las pruebas funcionales de sus servicios web (si es que necesita hacer eso) de las pruebas unitarias de su clase que procesa el resultado del servicio web.

Para probar la unidad, debe burlarse de la llamada de servicio web, proporcionando un resultado simulado. Luego, su prueba verificará que, para ese resultado bien definido, su clase se comporte en consecuencia.

Si también desea realizar pruebas funcionales de su servicio web (digamos que devuelve una respuesta específica dada alguna solicitud), no necesita burlarse de nada, simplemente llame al servicio y haga afirmaciones sobre el resultado.

Al separar sus pruebas, tiene un control más preciso sobre las ejecuciones de prueba. Por ejemplo, podría ejecutar las pruebas de unidad de ejecución rápida cada vez que cambie el código, pero ejecutar las pruebas funcionales de ejecución lenta todas las noches, en un servidor dedicado o según sea necesario. Y cuando se rompe una prueba, sabrá si es su código o algo incorrecto con el servicio web.

+2

Ya tengo pruebas en conserva con devoluciones falsas inmediatas del servicio web. Esta pregunta fue sobre pruebas de integración con el servicio web real. Admito que podría dejar de lado la aplicación, pero eso no cambia el hecho de que tengo que esperar el resultado de alguna manera. Y: con los resultados enlatados, no pruebo tener una latencia entre la solicitud y el resultado, como con los resultados enlatados, el delegado de resultados en realidad se llama * antes * de que la llamada de solicitud haya finalizado. – fabb