Cómo probar unidades de llamadas api utilizando AFNetworking

Tengo una aplicación de iOS en la que estoy trabajando, que se conecta a un service web de terceros. Tengo alnetworkingedor de 50 llamadas diferentes y quiero escribir testings de unidad con Kiwi, pero no tengo idea de por dónde empezar.

Como no soy responsable de la API, debo comprobar que mis llamadas apunten a la URL correcta, utilizando el método GET o POST correcto.

¿Hay alguna manera de probar esto correctamente?

Este es un ejemplo de una de mis llamadas:

+ (void)listsForUser:(NSString *)username response:(void (^)(NSArray *lists))completion { NSString *path = [NSString stringWithFormat:@"user/list.json/%@/%@", TRAKT_API_KEY, username]; [TNTraktAPIManager requestWithMethod:GET path:path parameters:nil callback:^(id response) { completion(response); }]; } 

Que llama al siguiente método de ayuda

 + (void)requestWithMethod:(HTTPMethod)method path:(NSString *)path parameters:(NSDictionary *)params callback:(void (^)(id response))completion { NSString *methodString = @"POST"; if (method == GET) { methodString = @"GET"; } // Setup request NSURLRequest *request = [[TraktAPIClient shanetworkingClient] requestWithMethod:methodString path:path parameters:params]; // Setup operation AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { id jsonResults = JSON; completion(jsonResults); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { id jsonResults = JSON; completion(jsonResults); NSLog(@"%s: error: %@", __PRETTY_FUNCTION__, error); }]; // TODO: Queue operations [operation start]; } 

Si configura una expectativa de expectativa en la class auxiliar y utiliza el receive:(SEL)withArguments:(id)... , puede verificar que el argumento recibido sea el esperado.

Dos gotchas que vale la pena conocer están configurando la expectativa antes de hacer la llamada; y usar el formulario shouldEventually lugar de should para que la testing se demore el time suficiente para que se realice la llamada.

Recomiendo revisar OHHTTPStubs para la unit testing de sus classs de API.

Las testings unitarias deben ser deterministas y agregar a Internet una API potencialmente impnetworkingecible en la mezcla hace que las condiciones de testing no sean deterministas.

OHTTPStubs le permitirá ocultar la respuesta a sus requestes HTTP salientes. Básicamente, intercepta su tráfico HTTP y si la request coincide con los criterios que estableció, le da una respuesta enlatada que declara en JSON (en lugar de un resultado impnetworkingecible de la API). Esto le permite configurar diferentes escenarios de respuesta en sus classs de testing: es decir. Error 404, datos de respuesta parcial, etc. para usar en sus testings.

He aquí un ejemplo:

Creé este JSON Stub y lo guardé como un file JSON:

 { "devices" : [ { "alarm" : { "alarm_id" : 1, "attack_time" : "<null>", "defined_time" : "2014-04-14T04:21:36.000Z", "device_id" : 7, "is_protected" : 0 }, "device_type" : "iPhone", "id" : 7, "os_version" : "7.1" } ], "email" : "mystubemail@gmail.com", "facebook_id" : 5551212, "id" : 3, "name" : "Daffy Duck" } 

Siempre que las requestes de networking se realicen en la llamada API, este JSON se devuelve debido a esta OHHTTPStub que se declara en la class de testing para ejecutarse antes de todas las testings.

 [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { BOOL stringFound; if ([[request.URL description] rangeOfString:[NSString stringWithFormat:@"%@devices/register?", BASEURL]].location != NSNotFound) { stringFound = YES; } NSLog(@"%d", stringFound); return stringFound; } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { // Stub it with our "RegisterDevice.json" stub file return [[OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"RegisterDevice.json",bundle) statusCode:200 headers:@{@"Content-Type":@"text/json"}] requestTime:1.0 responseTime:1.0]; }]; 

No estoy seguro de si Kiwi permite realizar testings asíncronas, pero si no, también recomiendo search en Specta y el marco de comparación Expecta. Permiten una testing de unidad asíncrona súper fácil, que cuando se combina con OHHTTPStubs proporciona todo lo que necesita para probar las llamadas a la API de la unidad.

Yo recomendaría Nocilla

Marque esta otra respuesta a una pregunta similar para get más información.