cocoaheads rennes #16: ohhttpstubs

9

Click here to load reader

Upload: cocoaheadsrns

Post on 27-Jun-2015

3.433 views

Category:

Technology


4 download

DESCRIPTION

Olivier Halligon nous a présenté sa librairie OHHTTPStubs. Cette dernière permet de bouchonner vos requêtes réseau facilement. Sans modifier le code de votre application. Très utile dans les phases de développement et de test.

TRANSCRIPT

Page 1: CocoaHeads Rennes #16: OHHTTPStubs

OHHTTPSTUBSBouchonner vos requêtes réseau facilement!sans modifier le code de votre application

CocoaHeads Rennes!20 février 2014

SmallTalk par O.Halligon

Page 2: CocoaHeads Rennes #16: OHHTTPStubs

OBJECTIF

• Intercepter les requêtes réseau sortantes!

• Retourner une réponse toute faite à la place!

• La requête ne part finalement pas sur le net!

• On se substitue au serveur pour retourner la réponse qu’on veut

Page 3: CocoaHeads Rennes #16: OHHTTPStubs

CAS D’USAGE

• Tests Unitaires

• Sans dépendre du réseau ou de la connectivité!• Avec des réponses déterministes et invariantes.

• Tests d’asynchronisme en conditions dégradées

• Simuler un réseau lent!• Vérifier que votre application ne gèle pas et affiche des spinners

• Développement avant la livraison des BackEnds / WS

• Développez vos modules d’appel aux WebServicesmême si ceux-ci ne sont pas encore prêts

Page 4: CocoaHeads Rennes #16: OHHTTPStubs

EXEMPLES

[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { ! return YES; !} withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { ! NSData* stubData = [@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding]; return [OHHTTPStubsResponse responseWithData:stubData statusCode:200 headers:nil]; !}];

• Toutes les requêtes retournent un texte constant

Page 5: CocoaHeads Rennes #16: OHHTTPStubs

EXEMPLES

[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { ! return [request.URL.host isEqualToString:@"mywebservice.com"]; !} withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { ! return [OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"wsresponse.json",nil) statusCode:200 headers:@{@"Content-Type":@"text/json"}]; !}];

• Seulement les requêtes vers mywebservice.com!• Utilisation d’un fichier « .json » (embarqué dans l’application)!• Headers spécifiques

Page 6: CocoaHeads Rennes #16: OHHTTPStubs

EXEMPLES

[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { ! return [request.URL.host isEqualToString:@"mywebservice.com"]; !} withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { ! NSArray* stringList = [request.URL pathComponents]; NSDictionary* dico = @{@"response": stringList, @"error":@NO}; return [[OHHTTPStubsResponse responseWithJSONObject:dico statusCode:200 headers:nil] responseTime:OHHTTPStubsDownloadSpeed3G]; !}];

• Seulement les requêtes vers mywebservice.com!• Utilisation d’un NSDictionary converti automatiquement en JSON!• Simulation d’un temps de réponse

Catégorie OHHTTPStubsResponse+JSON.h!⇒ Sérialise le dictionnaire en JSON + rajoute le header «application/json»

Page 7: CocoaHeads Rennes #16: OHHTTPStubs

EXEMPLES

@implementation MyWebService + (NSString*)baseURL { return @"http://myserver.tld/webservice/"; } !+ (void)fetchUserWithID:(int)userID completion:(void(^)(id user))completion { NSURL* baseURL = [NSURL URLWithString:self.baseURL]; AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL]; [sessionManager GET:[NSString stringWithFormat:@"user/%d",userID] parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { completion(responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { completion(nil); }]; } @end

Page 8: CocoaHeads Rennes #16: OHHTTPStubs

EXEMPLES@implementation MyWebService + (NSString*)baseURL { return @"http://myserver.tld/webservice/"; } !+ (void)fetchUserWithID:(int)userID completion:(void(^)(id user))completion { NSURL* baseURL = [NSURL URLWithString:self.baseURL]; AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL]; [sessionManager GET:[NSString stringWithFormat:@"user/%d",userID] parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { completion(responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { completion(nil); }]; } @end

- (void)testFetchUser { NSDictionary *expectedUser = @{@"id":@123,@"firstname":@"John",@"lastname":@"Appleseed"}; [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { return [request.URL.absoluteString hasPrefix:[MyWebService baseURL]]; } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { return [OHHTTPStubsResponse responseWithJSONObject:expectedUser statusCode:200 headers:nil]; }]; [MyWebService fetchUserWithID:123 completion:^(id user) { STAssertEqualObjects(user, expectedUser, @"Unexpected data received"); [self notifyAsyncOperationDone]; }]; [self waitForAsyncOperationWithTimeout:1.0]; }

Page 9: CocoaHeads Rennes #16: OHHTTPStubs

INSTALLATION

• Sur GITHub : http://github.com/AliSoftware/OHHTTPStubs!• Disponible via CocoaPods!• Fonctionne avec tout framework réseau utilisant l’URL Loading

System standard de Cocoa!NSURLConnection, NSURLSession, AFNetworking, …!

• Limitations :!• Ne supporte pas les Background Sessions!• Ne bouchonne pas l’upload de données

pod "OHHTTPStubs"