XCTest:NSURLSession:在主线程

时间:2016-07-08 19:23:52

标签: xcode asynchronous timeout nsurlsession xctest

运行执行网络操作的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个测试。

0 个答案:

没有答案