2012-01-27 10 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

+0

@Besi no、ブロックに設定されると、doSomethingWithBlockが返ってもYESに設定されたままになります。これが__block変数の "魔法"です。 – dasblinkenlight

+0

まさか!今私は混乱していて興奮しています:-)私はそれにショットをあげるでしょう、事前に感謝します。 – Besi

関連する問題