【发布时间】:2020-11-15 17:51:34
【问题描述】:
在 UI 类中,我有一个访问 UI 元素的方法,因此应该强制自己进入主线程。这是我的意思的一个最小示例:
class SomeUI {
func doWorkOnUI() {
guard Thread.isMainThread else {
DispatchQueue.main.async {
self.doWorkOnUI()
}
return
}
print("Doing the work on UI and running on main thread")
}
}
在测试中,当然测试doWorkOnUI()已经在主线程上运行的情况是没有问题的。我只是这样做:
func testWhenOnMainThread() {
let testedObject = SomeUI()
let expectation = XCTestExpectation(description: "Completed doWorkOnUI")
DispatchQueue.main.async {
testedObject.doWorkOnUI()
expectation.fulfill()
}
wait(for: [expectation], timeout: 10.0)
// Proceed to some validation
}
即:强制执行到主线程。等待它完成。做一些检查。
但是如何测试相反的情况,即确保函数在从后台线程调用时强制自己在主线程上运行?
例如,如果我执行以下操作:
...
DispatchQueue.global(qos: .background).async {
testedObject.doWorkOnUI()
expectation.fulfill()
}
...
我刚刚测试了该函数是从后台线程执行的。但我没有明确检查它是否在主线程上运行。当然,由于此函数访问 UI 元素,因此如果不强制在主线程上,预期它会崩溃。那么“没有崩溃”是这里唯一可测试的条件吗?有没有更好的?
【问题讨论】:
标签: swift multithreading xctest