メソッドにこのコードがあります:
- (NetworkOperation *)runOperationWithPath:(NSString *)path
params:(NSDictionary *)params
httpMethod:(NSString *)httpMethod
completionHandler:(DictionaryCompletionHandler)completionHandler;
{
NetworkOperation *op = (NetworkOperation *)[self operationWithPath:path
params:[params mutableCopy]
httpMethod:httpMethod
ssl:YES];
[op addCompletionHandler:^(NetworkOperation *completedOperation) {
NSData *responseData = [completedOperation responseData];
NSError *error;
NSDictionary *returnDict = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
if(error == nil && !self.timedOut) {
completionHandler(returnDict, nil);
} else {
completionHandler(nil, error);
}
} errorHandler:^(NetworkOperation *completedOperation, NSError *error) {
//Manage error
}];
[self enqueueOperation:op];
return op;
}
私はそれの単体テストを作成していますが、この奇妙な動作を見つけました。単体テストでは、OHHTTPStubs を使用してネットワーク レスポーズをスタブ化しています。単体テストのコードはこちら
- (void)testThatTheRequestRunAndCallsTheCompletationBlock; {
//Here i have the setup of OHHTTPStubs to stub the responses.
__block BOOL called = NO;
[self.restClient runOperationWithPath:@"Rest/clientTest" params:nil httpMethod:@"POST" authenticationEngine:nil completionHandler:^(NSDictionary *result, NSError *error) {
called = YES;
}];
while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) && !blockFinished)
STAssertTrue(called, @"The completation block should be called");
}
単一の単体テストを実行するとすべてうまくいきます。単体テストのスイート全体を実行すると、nil の completationHandler を呼び出してアプリがクラッシュします。最初のケース (1 回の実行) では、ネストされたブロックが正しくコピーされているため、テスト スイート全体を実行すると、ネストされたブロックがコンテナー ブロックによって正しくキャプチャされないため、わかりません。
OHHTTPStubs とブロック待機コードを削除しようとしましたが、何も変わりません。どのようにデバッグできるかについてのアイデアはありますか?