非同期タスクが完了するまで待機する必要がある単体テストがあります。私は NSConditionLock を使用しようとしていますが、それはかなりクリーンなソリューションのようですが、動作させることができません。
いくつかのテスト コード:
- (void)testSuccess
{
loginLock = [[NSConditionLock alloc] init];
Login login = [[Login alloc] init];
login.delegate = self;
// The login method will make an async call.
// I have setup myself as the delegate.
// I would like to wait to the delegate method to get called
// before my test finishes
[login login];
// try to lock to wait for delegate to get called
[loginLock lockWhenCondition:1];
// At this point I can do some verification
NSLog(@"Done running login test");
}
// delegate method that gets called after login success
- (void) loginSuccess {
NSLog(@"login success");
// Cool the delegate was called this should let the test continue
[loginLock unlockWithCondition:1];
}
私はここで解決策に従おうとしていました: How to unit test asynchronous APIs?
ロックすると、デリゲートは呼び出されません。ロックコードを取り出して簡単なタイマーを入れると、問題なく動作します。
スレッド全体をロックし、ログイン コードを実行させず、実際に非同期呼び出しを行っていますか?
また、ログイン呼び出しを別のスレッドに配置して、ロックされないようにしました。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
[login login];
});
私は何を間違っていますか?
ログインコードを追加して編集します。読みやすくするためにコードをトリミングします。基本的に、AFNetworking を使用して POST を実行するだけです。完了すると、デリゲート メソッドが呼び出されます。ログインして http リクエストを作成します。
NSString *url = [NSString stringWithFormat:@"%@/%@", [_baseURL absoluteString], @"api/login"];
[manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (_delegate) {
[_delegate loginSuccess];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (_delegate) {
[_delegate loginFailure];
}
}];