この質問に対する解決策を考え出す他の投稿を読みました。ただし、彼らのソリューションでは、アプリケーションをテストできるようにするために、ハック コードをアプリケーションに追加する必要があります。私にとって、クリーンなコードは単体テストよりも重要です。
アプリで dispatch_async を定期的に使用していますが、単体テストに問題があります。問題は、メイン キューで非同期に実行されているため、テストが既に完了した後にブロックが実行されることです。ブロックが実行されるまで何らかの方法で待機してから、テストを続行する方法はありますか。
単体テストのためだけにブロックに完了を渡したくありません
- (viod)viewDidLoad
{
[super viewDidLoad];
// Test passes on this
[self.serviceClient fetchDataForUserId:self.userId];
// Test fails on this because it's asynchronous
dispatch_async(dispatch_get_main_queue(), ^{
[self.serviceClient fetchDataForUserId:self.userId];
});
}
- (void)testShouldFetchUserDataUsingCorrectId
{
static NSString *userId = @"sdfsdfsdfsdf";
self.viewController.userId = userId;
self.viewController.serviceClient = [[OCMockObject niceMockForClass:[ServiceClient class]];
[[(OCMockObject *)self.viewController.serviceClient expect] fetchDataForUserId:userId];
[self.viewController view];
[(OCMockObject *)self.viewController.serviceClient verify];
}