我有一个测试类和一个测试用例。当我运行我的单元测试时,Xcode告诉我所有的测试都通过了,但是我发出警告说我的测试没有完成。
我是否必须使用XCTest做一些特别的事情让它知道我已经完成了特定的测试用例?
更新: 这可能是一个时间问题/错误。我放了一个[NSThread sleepForTimeInterval:.1];在tearDown方法中,现在它每次都有效。 Xcode也可以在没有睡眠的情况下定期完成测试。
更新2: 看起来像一些奇怪的Xcode错误,我添加了第三个测试,它正在进行文本格式化验证,警告再次出现。
答案 0 :(得分:13)
我从来没有得到你提到的警告,但是在转换为Xcode 5 XCTest(带有重构菜单并自己交换框架)后,我的测试永远运行(对于永远的某些值......)但从未真正开始执行(setUp和完全没有调用的测试方法。
我改变了我的测试目标,Build Settings>包装>包装器从“octest”扩展到“xctest”,问题立即得到解决。
要回答您的问题,测试应在其执行完成并且其tearDown方法完成后立即完成。没有代码的测试将成功通过。尝试在测试中设置断点或日志消息以验证它是否实际被调用,并确保您的tearDown不会因任何原因而挂起。
答案 1 :(得分: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;
}];
}
答案 2 :(得分:0)
当我尝试在iOS 6模拟器上运行时,我遇到了同样的问题。 确保您在iOS7模拟器上运行测试,而不是iOS6。 XCTest仅在iOS7之后可用。