XCTest报API violation - cannot set inverted错误的触发原因
触发XCTest等待API违规崩溃的常见场景
执行wait(for: [expectation], timeout: timeout)时抛出API violation - cannot set inverted on <unitTestName> after already waiting on it错误,本质是XCTest框架检测到对已经启动等待流程的XCTestExpectation实例修改了isInverted属性,所有触发该错误的操作都围绕这个核心逻辑,具体包括:
- 重复复用同一个expectation实例:第一次调用
wait启动等待流程后,后续代码显式给该实例的isInverted属性赋值(无论赋值为true还是false),或是调用了会隐式修改该属性的自定义封装方法 - 多线程时序错误:将修改expectation
isInverted属性的逻辑放到子线程异步/延迟执行,主线程先执行到wait方法启动等待,属性修改的实际执行时间落在等待流程启动之后 - 代码编写顺序错误:把expectation的属性配置逻辑写在了
wait调用之后,比如先执行等待逻辑,后续才补充expectation.isInverted = true这类配置代码 - 对同一个expectation多次调用
wait方法,第二次调用wait之前修改了它的isInverted标记 - 跨用例复用expectation实例:用全局变量、静态变量、测试类持久属性持有expectation对象,上一个测试用例运行时已经对该实例执行过wait操作,当前用例复用这个旧实例时,先修改
isInverted属性再调用wait,框架会判定该实例已经进入过等待流程,修改属性违规
XCTest中的expectation是一次性使用对象,不要跨等待流程、跨测试用例复用,所有属性配置(包括isInverted、expectedFulfillmentCount、assertForOverFulfill等)必须在第一次调用wait方法之前完成。
内容的提问来源于stack exchange,提问作者TMin
相关产品推荐
相关产品推荐

