You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对未成功执行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:07:13