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

如何为自定义异步断言函数XCTAssertThrowsErrorAsync编写单元测试?

异步断言函数XCTAssertThrowsErrorAsync的单元测试方案

针对你实现的XCTAssertThrowsErrorAsync函数,需要覆盖核心场景的单元测试,确保其行为符合预期:

测试场景1:表达式抛出错误时,函数正常捕获错误且不触发XCTFail

这个测试验证当传入的异步表达式抛出错误时,函数会调用错误处理器,且不会触发XCTFail。

enum TestError: Error {
    case test
}

final class XCTAssertThrowsErrorAsyncTests: XCTestCase {
    func testThrowsErrorAsync_CatchesError() async {
        // 定义一个会抛出错误的异步函数
        func asyncThrowError() async throws {
            throw TestError.test
        }

        var errorCaught = false
        await XCTAssertThrowsErrorAsync(asyncThrowError()) { error in
            // 验证捕获的错误类型正确
            XCTAssertTrue(error is TestError)
            errorCaught = true
        }

        // 确认错误处理器被调用
        XCTAssertTrue(errorCaught)
    }
}

测试场景2:表达式不抛出错误时,函数触发XCTFail

这个测试验证当异步表达式没有抛出错误时,函数会正确触发XCTFail。我们用XCTExpectFailure标记预期的失败,确保测试正常通过。

extension XCTAssertThrowsErrorAsyncTests {
    func testThrowsErrorAsync_TriggersXCTFailWhenNoError() async {
        // 定义一个不会抛出错误的异步函数
        func asyncNoThrow() async -> Int {
            return 42
        }

        // 预期会触发XCTFail
        let expectation = XCTExpectFailure()
        expectation.expectationDescription = "Expected an error but none was thrown"
        
        await XCTAssertThrowsErrorAsync(asyncNoThrow(), "Expected an error but none was thrown")
        
        // 验证预期的失败是否发生
        wait(for: [expectation], timeout: 1.0)
    }
}

测试场景3:自定义错误消息正确传递到XCTFail

这个测试验证当触发XCTFail时,传入的自定义消息会被正确使用。

extension XCTAssertThrowsErrorAsyncTests {
    func testThrowsErrorAsync_UsesCustomMessageOnXCTFail() async {
        let customMessage = "Custom error message for missing error"
        
        func asyncNoThrow() async -> String {
            return "Success"
        }

        let expectation = XCTExpectFailure()
        expectation.expectationDescription = customMessage
        
        await XCTAssertThrowsErrorAsync(asyncNoThrow(), customMessage)
        
        wait(for: [expectation], timeout: 1.0)
    }
}

关键注意事项

  • 所有测试方法必须标记为async,因为要调用异步的断言函数
  • 使用XCTExpectFailure验证预期的XCTFail行为,避免测试因触发断言而失败
  • 覆盖错误类型验证、无错误场景、自定义消息三个核心场景,确保函数逻辑完整

内容的提问来源于stack exchange,提问作者Daumantas Versockas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:20:37