A while back I posted my tweak to some Xcode testing for asynchronous calls. Here’s an update I did in Swift for XCTestCase.
extension XCTestCase {
/**
For use testing async functions.
Will wait for completion of the function.
You need to provide a test function for when the call is completed.
The ultimate timeout should be provided for cases of there not
being a response.
let _ = self.waitUntilReady(completionTest: { () -> Bool in
return remoteInterface?.isBusy == false
})
or as a trailing closure:
let _ = self.waitUntilReady() {
return remoteInterface?.isBusy == false
}
optionally using your own timeout:
let _ = self.waitUntilReady(timeout: 20) {
return remoteInterface?.isBusy == false
}
*/
func waitUntilReady(timeout seconds:TimeInterval = 30, completionTest: () -> Bool) -> TimeInterval {
let start = Date.timeIntervalSinceReferenceDate
let loopUntil = Date(timeIntervalSinceNow: seconds)
while completionTest() == false && loopUntil.timeIntervalSinceNow > 0 {
RunLoop.current.run(mode: .defaultRunLoopMode, before: loopUntil)
}
let finish = NSDate.timeIntervalSinceReferenceDate
let runtime = finish - start
return runtime
}
}