2012-01-27 116 views
2

我有一個應該調用完成塊或失敗塊的方法的單元測試。現在我知道每個情況下應該調用哪一個,所以我在不應該調用的塊中使用STFail如何測試塊是否被調用

我該如何測試應該調用的塊是否真的被調用?

這是我的設置:

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); 
}]; 

回答

3

你需要從塊中添加塊變量,並將它們設置:

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); 
}]; 

在這一點上,你可以做出的successBlockInvoked值斷言和failureBlockInvoked:如果沒有設置預期值,則表示測試失敗。

+0

但是我可以在哪裏做這個斷言。如果我在調用'doSomethingWithParameter'之後執行它,那麼它將被設置爲'NO',對吧? – Besi 2012-01-27 12:01:13

+0

@Besi否,一旦它被設置在塊中,即使在doSomethingWithBlock返回後,它仍將保持爲YES。這是__block變量的「魔力」。 – dasblinkenlight 2012-01-27 12:23:06

+0

沒辦法?!現在我既困惑又興奮:-)我會給它一個鏡頭,提前感謝。 – Besi 2012-01-27 12:27:10

相關問題