如何对未成功执行的async/await异步代码进行单元测试?
测试Async/Await异步函数执行失败的场景
针对你遇到的问题,分两种场景给出解决方案:
场景1:异步函数通过抛出错误表示失败
如果你的load()函数设计为成功时返回结果,失败时抛出错误,直接用XCTest的XCTAssertThrowsAsync断言即可,这对应你之前用反转期望测试“不进入成功闭包”的场景:
func testLoadFailsUnderSpecificCondition() async { // 先设置触发失败的特定场景(比如模拟网络错误、资源不存在等) // 断言load函数会抛出错误 await XCTAssertThrowsAsync(try fooManager.load()) }
场景2:异步函数失败时不会返回(无错误抛出但挂起)
如果你的load()函数设计比较特殊,失败时不会抛出错误,而是一直挂起不返回,可以结合Task和XCTest期望来模拟之前的反转期望逻辑:
func testLoadDoesNotCompleteUnderSpecificCondition() async { let expectation = expectation(description: "load should not complete") expectation.isInverted = true // 启动异步任务执行load,不阻塞测试线程 Task { await fooManager.load() // 如果load完成了,就触发期望 expectation.fulfill() } // 等待超时,反转期望下,超时即代表测试通过(load没完成) await waitForExpectations(timeout: 1) }
额外建议
优先推荐场景1的设计:让异步函数通过抛出错误来表示失败,这更符合Swift async/await的设计规范,测试逻辑也更清晰直观,避免无意义的线程挂起。
内容的提问来源于stack exchange,提问作者Tometoyou
相关产品推荐
相关产品推荐

