我正在测试一种在后台运行并在完成时执行代码块的方法。我正在使用期望来处理测试的异步执行。我写了一个简单的测试来显示行为:
- (void) backgroundMethodWithCallback: (void(^)(void)) callback {
dispatch_queue_t backgroundQueue;
backgroundQueue = dispatch_queue_create("background.queue", NULL);
dispatch_async(backgroundQueue, ^(void) {
callback();
});
}
- (void) testMethodWithCallback {
XCTestExpectation *expectation = [self expectationWithDescription:@"Add collection bundle"];
[self backgroundMethodWithCallback:^{
[expectation fulfill];
usleep(50);
XCTFail(@"fail test");
}];
[self waitForExpectationsWithTimeout: 2 handler:^(NSError *error) {
if (error != nil) {
XCTFail(@"timeout");
}
}];
}
该XCTFail(@"fail test");
测试线应该失败,但测试通过了。
我还注意到,这只发生在代码在回调上运行需要一定时间时(在我的例子中,我正在检查文件系统上的一些文件)。这就是为什么usleep(50);
需要这条线来重现这个案例。