我正在使用SocketRocket库来处理与 Websocket 的连接。它连接得很好,但我正在尝试运行一些必须首先等待 WS 连接的单元测试。由于知道 WS 已连接的唯一方法是通过其委托方法,因此我无法使此过程同步。我希望我的单元测试setup方法简单地创建一个 WS 连接然后tearDown关闭它。
我已经为我的 Websocket 类实现了两种类型的连接方法。前两个非常基本,我已经验证它们按预期工作。最后一个是我尝试将其阻塞主要用于测试目的。我无法让它工作,它最终会永远等待,所以我相信这是我的概念上的误解。
我想我的大问题是如何在测试用例中停止执行以等待对代表的回电?测试用例中出现的问题是我不能只在完成块中进行所有测试——测试方法将其视为成功并结束程序。
- (void)connect
{
    DLog(@"Websocket is connecting now");
    [_socket open];
}
- (void)connectWithCompletion:(WebsocketConnection)completion
{
    DLog(@"Connecting now...");
    [_onConnectBlocksToRun addObject:^{
        completion(self.isConnected, self.socket);
    }];
    [_socket open];
}
- (bool)connectBlocking // XXX Doesn't work!
{
    sem = dispatch_semaphore_create(0);
    [_socket open];
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    return _isConnected;
}
#pragma mark - Socket rocket delegate
- (void)webSocketDidOpen:(SRWebSocket *)webSocket
{
    DLog(@"Websocket has opened");
    _isConnected = YES;
    _socket = webSocket;
    for (void(^block)() in _onConnectBlocksToRun) {
        block();
    }
    [_onConnectBlocksToRun removeAllObjects];
    if (sem) {
        dispatch_semaphore_signal(sem);
        dispatch_release(sem);
    }
}