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

如何为触发assertionFailure的3DTouch处理逻辑编写单元测试?

正确编写单元测试验证assertionFailure场景

你当前的单元测试传入"fakeDeeplink"时,会触发handleTouch方法里的assertionFailure("3DTouch not trackable"),要验证这个场景,可按以下方式编写测试:

1. 验证未支持的Deeplink触发断言

在XCTest中,你可以用XCTExpectFailure标记预期的断言失败,既验证断言触发,又能正常执行后续的URL非空校验:

func testUnsupportedDeeplinkTriggersAssertion() {
    // 标记该测试预期会触发断言失败,不会导致测试用例报错
    XCTExpectFailure("Expected assertion for unsupported deeplink") {
        let fakeDeeplink = "fakeDeeplink"
        let url = touchManager?.handleTouch(["deeplink": fakeDeeplink as NSSecureCoding])
        XCTAssertNotNil(url)
    }
}

如果需要精准捕获断言的具体消息,可以自定义断言处理器来捕获:

func testUnsupportedDeeplinkTriggersSpecificAssertion() {
    // 保存原始断言处理器,测试后恢复
    let originalHandler = Thread.current.threadDictionary["assertionHandler"]
    defer {
        Thread.current.threadDictionary["assertionHandler"] = originalHandler
    }
    
    var didTriggerTargetAssertion = false
    // 自定义处理器捕获指定消息的断言
    let customHandler = AssertionHandler { _, _, message, _ in
        if message == "3DTouch not trackable" {
            didTriggerTargetAssertion = true
        }
    }
    Thread.current.threadDictionary["assertionHandler"] = customHandler
    
    // 执行测试逻辑
    let fakeDeeplink = "fakeDeeplink"
    let url = touchManager?.handleTouch(["deeplink": fakeDeeplink as NSSecureCoding])
    
    // 验证断言触发及URL返回结果
    XCTAssertTrue(didTriggerTargetAssertion)
    XCTAssertNotNil(url)
}

2. 扩展:测试支持的Deeplink场景

如果后续handleTouch添加了支持的shortcut分支,补充对应的测试用例,确保合法Deeplink不会触发断言:

func testSupportedDeeplinkWorksWithoutAssertion() {
    let supportedDeeplink = "myapp://home"
    let url = touchManager?.handleTouch(["deeplink": supportedDeeplink as NSSecureCoding])
    
    XCTAssertNotNil(url)
    // 此处不会触发断言,无需额外处理
}

注意事项

  • assertionFailure仅在Debug模式下生效,Release模式会被编译器优化移除,测试需在Debug配置下运行。
  • XCTExpectFailure适合快速标记预期失败,自定义处理器则能更精准地验证断言的具体内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:45:30