运行执行网络操作的XCTest时,出现以下错误:
-waitForExpectationsWithTimeout:超时但无法运行超时处理程序,因为主线程没有响应(等待超时后允许0.5秒)。可能导致此问题的条件包括处理主线程上的IO,调用sleep(),死锁和同步IPC。 Xcode将尝试重新启动该过程并继续进行下一次测试......
我有一个测试,它执行一个使用NSURLSession的网络命令方法。
此测试是具有4个连续网络请求测试的测试类的一部分。
当独立于其他测试运行时,它每次都成功。 运行整个Test文件(总共4个测试)时,每次都会成功。
但是当运行整个测试套件(50次测试)时,我在第一次网络操作测试中得到“Stall on main thread”。其他3个网络运营测试都很顺利。
以下是测试的代码:
- (void)test_session_001_ObtainsSessionObjectFromServer
{
XCTestExpectation *expectation = [self expectationWithDescription:[self description]];
id<IPVideoSessionProtocol> provider = [IPVideoSessionFactory getProvider];
[provider createVideoSessionWithUserID:@"SomeUserID"
withCompletionBlock:^(IPVideoSession *session) {
if ([session isKindOfClass:[IPVideoSession class]] &&
[session.sessionID isKindOfClass:[NSString class]] &&
session.sessionID.length > 0) {
// The returned session ID is populated
[expectation fulfill];
}
}];
[self waitForExpectationsWithTimeout:5.0f handler:^(NSError *error) {
if (error)
{
XCTFail(@"IPVideoSessionManagerTests Did not execute in allotted time");
}
}];
}
createVideoSession中的代码......
- (void)createVideoSessionWithUserID:(NSString*)userID
withCompletionBlock:(IPVideoSessionCompletionBlock)block
{
IPCreateVideoSessionCommand* command = [[IPCreateVideoSessionCommand alloc]
initWithUserID:userID];
[command executeWithCompletionBlock:^(IPNetworkError *error, NSString *resultJSON)
{
if (error) {
[IPAlertPresenter displayNetworkError:error];
block(nil);
return;
}
NSDictionary *dict = [resultJSON toJsonDictionary];
block([IPVideoSession getSessionFromDictionary:dict]);
}];
}
executeWithCompletionBlock中的代码:
- (void)executeWithCompletionBlock:(CommandCompletionBlock)block
{
if (!self.isConnected && ![[IPDebugManager sharedInstance] networkBypassActivated]) {
IPNetworkError* error = [[IPNetworkError alloc] initWithType:NetworkErrorTypeNotConnectedToNetwork];
block(error, nil);
return;
}
NSURLSession *session = [self composeSession];
NSURLRequest *request = [self composeRequest];
self.strongSelf = self;
__weak __typeof(self) weakSelf = self;
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
[IPDispatch toMainThread:^{
[weakSelf
handleCommandResponse:response
withData:data
withError:error
withCompletionBlock:block];
weakSelf.strongSelf = nil;
}];
}];
[dataTask resume];
}
注意:只有在运行所有测试时才会出现此错误。此测试单独成功,并且:如果我在此测试类中运行所有4个测试。