如何为触发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
相关产品推荐
相关产品推荐

