基本思想是您的测试必须创建一个期望:
let e = expectation(description: "testGetUsers")
然后当你的异步方法完成时,满足这个期望:
e.fulfill()
然后,当然,您的测试必须在启动异步任务之后,等待期望:
waitForExpectations(timeout: 10)
但是,显然,您需要知道您的功能何时完成。我建议给它一个可选的完成处理程序:
func firePendingEvent(completion: (() -> Void)? = nil) {
let group = DispatchGroup()
for analyticItem in eventQueue {
group.enter()
eventPriorityQueue.addOperationToQueue(operation: BlockOperation {
self.analyticsObserver?.logEvent(event: analyticItem)
group.leave()
}, priority: .normal)
}
eventQueue.removeAll()
if let completion = completion {
group.notify(queue: .main, execute: completion)
}
}
(注意,我个人避免在迭代数组时对其进行变异,因此我将所有任务添加到队列中并推迟removeAll
到我不再迭代为止。)
无论如何,您现在可以编写测试:
func testFirePendingEvents() {
let e = expectation(description: "testGetUsers")
foo.firePendingEvent {
XCAssert(…) // do whatever tests are appropriate
e.fulfill()
}
waitForExpectations(timeout: 10)
}
但是,由于该完成处理程序是可选的,并且默认为nil
,因此您不必更改未利用新完成处理程序的其余代码。
就个人而言,我会向该完成处理程序闭包添加一个参数以传回您想要测试的任何值,但问题中没有足够的信息来知道您正在测试什么结果。