2010-01-06 8 views
3

J'ai une classe qui repose sur NSUserDefaults que j'essaie de tester unitaire et je fournis le NSUserDefaults comme un simulacre dans ma classe de test. Lors du test, je reçois l'erreur:OCMock sur une méthode avec argument et renvoie une valeur

OCMockObject[NSUserDefaults]: unexpected method invoked: dictionaryForKey:@"response"

Je suis en train de se moquer de cette méthode d'instance de la classe NSUserDefaults:

- (NSDictionary *)dictionaryForKey:(NSString *)defaultName; 

en utilisant le format d'appel:

[[[mockClass stub] andReturn:someDictionary] dictionaryForKey:@"aKey"] 

pour dire au simulacre qu'il doit attendre la méthode dictionaryForKey. Mais d'une manière ou d'une autre, ceci n'est pas enregistré ou n'est pas la bonne chose à dire à la simulation d'attendre puisque l'erreur m'indique que Mock n'a jamais su s'attendre à l'appel 'dictionaryForKey'.

La façon dont j'appelle le stub etReturn semble très similaire to this question mais dans celui-là, l'affiche indique qu'ils obtiennent une valeur de retour. Mon cas de test:

-(void)testSomeWork 
{ 
    id userDefaultsMock = [OCMockObject mockForClass:[NSUserDefaults class]];  
    MyClass *myClass = [[MyClass alloc] initWith:userDefaultsMock]; 

    NSDictionary *dictionary = [NSDictionary dictionary]; 

    [[[userDefaultsMock stub] andReturn:dictionary] dictionaryForKey:@"response"]; 

    BOOL result = [myClass doSomeWork]; 

    STAssertTrue(result, @"not working right"); 

    [myClass release]; 
    [userDefaultsMock verify]; 
} 

Ma classe:

@implementation MyClass 

@synthesize userDefaults; 
- (id)initWith:(NSUserDefaults *aValue) 
{ 
    if (self = [super init]) 
    { 
     self.userDefaults = aValue; 
    } 
    return self; 
} 

- (BOOL)doSomeWork 
{ 
    NSDictionary *response = [userDefaults dictionaryForKey:@"response"]; 

    if (response != nil) 
    { 
     // some stuff happens here 
     return YES; 
    } 

    return NO; 
} 
@end 

Toutes les suggestions?

Répondre

5

Vous ne savez pas si vous l'avez compris, mais c'est probablement lié à l'utilisation de stub avec verify. Vous devriez utiliser vérifier avec expect.

à savoir

[[[userDefaultsMock expect] andReturn:dictionary] dictionaryForKey:@"response"]; 
... 
[userDefaultsMock verify]; 

Dans ce cas, vous utilisez vérifier pour confirmer que votre méthode a en fait appeler la méthode attendue (dictionaryForKey :). Vous utilisez stub pour autoriser votre méthode à appeler une méthode donnée sur un objet Mock mais vous n'avez pas besoin de vérifier qu'il a été appelé.

Questions connexes