带async的异步测试用例在iOS模拟器中执行时为何挂起?
问题原因与解决方案
你的问题出在async测试方法里混用了老的阻塞式等待API:wait(for:timeout:)会卡住测试线程,而模拟器的并发调度逻辑下,你创建的Task可能需要等待测试线程空闲才能执行,结果两边互相等,形成死锁。真机的调度策略更灵活,所以没触发这个问题。
解决办法(二选一即可)
方法1:用异步版的expectation等待API
把wait(for:timeout:)换成await fulfillment(of:timeout:),这是XCTest专门给async测试方法设计的异步等待接口,不会阻塞线程,能和Task友好配合:
func test_Example() async { let exp = expectation(description: "It's the expectation") Task { print("Task says: Hello!") exp.fulfill() } await fulfillment(of: [exp], timeout: 600) }
方法2:直接await Task完成
如果你的场景不需要额外的expectation逻辑,也可以直接等待Task的执行结果,完全不用expectation:
func test_Example() async { // 等待Task执行完成 await Task { print("Task says: Hello!") }.value // 这里可以添加断言逻辑 }
内容的提问来源于stack exchange,提问作者MMise
相关产品推荐
相关产品推荐

