【问题标题】:XCTest did not finish in Xcode 5XCTest 没有在 Xcode 5 中完成
【发布时间】:2013-09-30 05:43:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能显示你的代码吗?测试方法预计无需任何特殊处理即可运行完成。
  • 这里有同样的错误,虽然我得到它没有测试开始:-/
  • 我遇到了同样的问题,你的 sleepForTimeInterval 技巧虽然很不幸,但也为我解决了这个问题。我认为这是 XCTest 或 Xcode 中的错误,因此目前看来这是一个合理的解决方法。
  • 我在 Xcode 5 创建的项目中遇到了这个问题。将[NSThread sleepForTimeInterval:.1]; (ickkk) 添加到我的测试的tearDown 方法中修复了它。不过,这似乎是一个 Xcode 错误。

标签: xcode5 xctest


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的更新暗示在 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;
        }];
    }
    

    【讨论】:

    • 我的测试只是创建 UILocalNotification 对象并确保在其中正确设置了所有日期。据我所知,没有发生任何背景或网络处理。很好的提示!
    【解决方案3】:

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

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

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

    【讨论】:

    • 我首先让 Xcode 为我转换为 XCTest,但是当我遇到这个问题时,我手动创建了测试目标,它现在具有正确的包装器扩展,但我仍然遇到同样的问题。
    • 谢谢 - 我有一个用于单元测试的标准 xcconfig 文件,这是我在转换过程中错过的重要一步。
    • 是的,自动转换似乎也没有改变这一点。
    • 成功了!谢谢!这是一个经典的 XCode'ish 烦恼。
    猜你喜欢
    • 2014-02-07
    • 2016-02-19
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2013-09-30
    • 2016-11-01
    相关资源
    最近更新 更多