如何用XCTAssertThrowsError测试async throws类型的Swift方法?
解决异步抛出方法的XCTAssertThrowsError测试问题
问题原因:XCTAssertThrowsError的自动闭包参数不支持并发调用,直接传入await object.doTheJob(param: "")会触发'async' call in an autoclosure that does not support concurrency错误。
以下是两种解决方案:
方法一:使用async测试方法+do-catch手动验证
这是推荐的方案,符合Swift并发最佳实践:
- 把测试方法标记为
async - 通过
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
相关产品推荐
相关产品推荐

