2010-05-04 12 views
0

Je voudrais tester une méthode qui utilise le géocodage inverse. Ce que je voudrais faire est:OCmock et MKReverseGeocoder

  • définir le géocodage comme propriété de mon contrôleur

  • créer le géocodage dans la méthode init

  • appel du géocodage dans la méthode que je veux Test

  • remplacer le géocodage avec une maquette dans mon test

Le problème est que la MKReverseGeocoder coordonner la propriété est en lecture seule, je ne peux le mettre dans la méthode constructeur:

[[MKReverseGeocoder alloc] initWithCoordinate:coord] 

Et bien sûr, les coordonnées ne sont disponibles que dans la méthode que je veux tester ..

Est-ce que quelqu'un sait comment je pourrais me moquer de la classe MKReverseGeocoder? Merci d'avance, Vincent.

Répondre

0

Découvrez Matt Gallagher's great article on unit testing Cocoa applications. Il fournit une extension de catégorie à NSObject qui vous permet de remplacer des instances au moment du test. Je l'ai utilisé pour faire quelque chose de similaire. Je pense que votre test ressemblerait à ceci:

#import "NSObject+SupersequentImplementation.h" 

id mockGeocoder = nil; 

@implementation MKReverseGeocoder (UnitTests) 

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate { 
    if (mockGeocoder) { 
     // make sure the mock returns the coordinate passed in 
     [[[mockGeocoder stub] andReturn:coordinate] coordinate]; 
     return mockGeocoder; 
    } 
    return invokeSupersequent(coordinate); 
} 

@end 

... 

-(void) testSomething { 
    mockGeocoder = [OCMockObject mockForClass:[MKReverseGeocoder class]]; 
    [[mockGeocoder expect] start]; 

    // code under test 
    [myObject geocodeSomething]; 

    [mockGeocoder verify]; 
    // clean up 
    mockGeocoder = nil; 
}