10

我有一个测试类和一个测试用例。当我运行单元测试时,Xcode 告诉我所有的测试都通过了,但是我有一个警告说我的测试没有完成。

我是否必须对 XCTest 做一些特别的事情才能让它知道我已经完成了特定的测试用例?

更新:这可能是时间问题/错误。我放了一个 [NSThread sleepForTimeInterval:.1]; 在 tearDown 方法中,现在它每次都有效。Xcode 还可以在没有睡眠的情况下定期自行完成测试。

更新 2:看起来像一些奇怪的 Xcode 错误,我添加了第三个测试,它只是进行文本格式验证,警告再次出现。

测试失败图像

4

3 回答 3

13

我从来没有收到你提到的警告,但是在转换为 Xcode 5 XCTest(使用重构菜单并自己交换框架)之后,我的测试永远运行(对于永远的某些值......)但从未真正开始执行(setUp 和测试方法不是完全调用)。

我将测试目标的 Build Settings > Packaging > Wrapper Extension 从“octest”更改为“xctest”,问题立即得到解决。

Wrapper Extension 设置现有值和新值

要回答您的问题,测试应在其执行完成并且其 tearDown 方法完成后立即完成。没有代码的测试将成功通过。尝试在测试中设置断点或日志消息以验证它实际上被调用并确保您的 tearDown 没有因任何原因挂起。

于 2013-09-24T22:16:30.460 回答
0

您的更新暗示在 tearDown 线程中休眠来解决它,如果您正在执行诸如网络或后台处理之类的事情,一个方便的技巧是设置一个标志并确保它被清除(如果没有则抛出错误)。清除响应代码中的标志。

下面的拆解和测试设置了一个两秒的计时器(嗯,它等待 250 毫秒八次)。

- (void)tearDown {
    [super tearDown];
    while (isProcessing > 0) {
        LogTrace(@"Polling...");
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.25]];
        isProcessing--;
        if(isProcessing == 0) {
            XCTFail(@"Network loop expired while awaiting response");
        }
    }
    LogTrace(@"Finished Polling");
}

-(void)testARandomRequest {
    isProcessing = 8;

    NSDictionary *parameters = @{@"code": @"54321"};
    [manager doAFNetworkPatch:@"restApi/1" andParameters:parameters andPredicate:^(NSURLResponse *response, NSError *error) {
        NSLog(@"Response received");
        isProcessing = 0;
    }];
}
于 2013-09-26T04:49:29.357 回答
0

尝试在 iOS6 模拟器上运行时,我遇到了与您相同的问题。确保您在 iOS7 模拟器上运行测试,而不是在 iOS6 上。XCTest 仅从 iOS7 开始可用。

于 2014-05-13T06:06:05.930 回答