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

如何用XCTAssertThrowsError测试async throws类型的Swift方法?

解决异步抛出方法的XCTAssertThrowsError测试问题

问题原因:XCTAssertThrowsError的自动闭包参数不支持并发调用,直接传入await object.doTheJob(param: "")会触发'async' call in an autoclosure that does not support concurrency错误。

以下是两种解决方案:

方法一:使用async测试方法+do-catch手动验证

这是推荐的方案,符合Swift并发最佳实践:

  1. 把测试方法标记为async
  2. 通过do-catch捕获异步方法的抛出错误,若未抛出则用XCTFail标记测试失败
func testDoTheJobThrows() async {
    let object = YourTargetClass()
    do {
        _ = await object.doTheJob(param: "")
        XCTFail("doTheJob 预期抛出错误,但实际未抛出")
    } catch {
        // 可选:验证错误的具体类型或内容
        guard let expectedError = error as? YourCustomError else {
            XCTFail("抛出的错误类型不符合预期")
            return
        }
        XCTAssertEqual(expectedError, .invalidParam)
    }
}

方法二:包装成同步闭包(不推荐)

如果测试环境不支持async测试方法,可将异步调用包装为同步闭包(会阻塞线程,不推荐用于新代码):

func testDoTheJobThrows() {
    let object = YourTargetClass()
    XCTAssertThrowsError(try Task { try await object.doTheJob(param: "") }.value) { error in
        // 可选:验证错误
        XCTAssertEqual(error as? YourCustomError, .invalidParam)
    }
}

内容的提问来源于stack exchange,提问作者Richard Topchii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:22:47