2012-01-27 3 views
2

J'ai un test unitaire pour une méthode qui devrait appeler un bloc d'achèvement ou un bloc défaillant. Maintenant, je sais pour chaque cas que l'on devrait être appelé alors j'utilise STFail dans le bloc qui ne devrait pas être invoqué.Comment tester si un bloc est appelé

Comment puis-je maintenant tester que le bloc qui doit être invoqué est réellement appelé?

C'est ma configuration:

NSString *parameter = @"foo"; 
[controller doSomethingWithParameter:parameter withcompletionBlock: 
^(NSString *result) 
{ 
    // This block should be invoked 
    // Check if the result is correct 
    STAssertEquals(result, kSomeOKConstant, @"Result shout be 'kSomeOKConstant'"); 
} failedBlock: 
^(NSString *errorMessage) { 
    STFail(@"No error should happen with parameter '%@'",parameter); 
}]; 

Répondre

3

Vous devez ajouter des variables de bloc, et les mettre à l'intérieur de vos blocs:

BOOL __block successBlockInvoked = NO; 
BOOL __block failureBlockInvoked = NO; 
NSString *parameter = @"foo"; 
[controller doSomethingWithParameter:parameter withcompletionBlock: 
^(NSString *result) { 
    successBlockInvoked = YES; 
    STAssertEquals(result, kSomeOKConstant, @"Result shout be 'kSomeOKConstant'"); 
} failedBlock: 
^(NSString *errorMessage) { 
    failureBlockInvoked = YES; 
    STFail(@"No error should happen with parameter '%@'",parameter); 
}]; 

À ce stade, vous pouvez faire des affirmations sur les valeurs de successBlockInvoked et failureBlockInvoked: si la valeur attendue n'est pas définie, votre test a échoué.

+0

Mais où puis-je faire cette assertion. Si je le fais après l'appel à 'doSomethingWithParameter' alors il sera réglé sur' NO' de toute façon, non? – Besi

+0

@Besi non, une fois qu'il est défini dans le bloc, il restera sur YES même après que doSomethingWithBlock soit retourné. C'est la "magie" des variables __block. – dasblinkenlight

+0

Pas moyen ?! Maintenant, je suis à la fois confus et excité :-) Je vais essayer, merci d'avance. – Besi

Questions connexes