XCUITest 验证 ui 中断处理程序发生

Posted

技术标签:

【中文标题】XCUITest 验证 ui 中断处理程序发生【英文标题】:XCUITest verify that ui interruption handler occurred 【发布时间】:2020-06-11 12:01:48 【问题描述】:

我对 swift 和 xcuitest 很陌生。我最近遇到了addUIInterruptionMonitor,用于处理可能弹出的警报。我想知道的是如何验证警报是否发生以及处理程序是否已处理。以以下为例

addUIInterruptionMonitorWithDescription("Location Services")  
  (alert) -> Bool in
  alert.buttons["Allow"].tap()
  return true


app.buttons["Request Location"].tap()
app.tap() // need to interact with the app again for the handler to fire
// after this if the handler never gets called I want the test to fail

我想测试警报是否真的发生,但据我了解,在我最后一次tap() 之后,如果警报从未被触发,我的处理程序将不会被调用。我需要测试警报是否真的发生了,然后可能会在处理程序的内容中添加一些断言

【问题讨论】:

【参考方案1】:

我似乎已经回答了我自己关于进一步调查的问题。对于使用 xcuitest 进行的异步测试,我可以使用 XCTestExpectation,它在创建时会导致测试等到期望得到满足,或者在某个超时后失败。这样我上面的代码就变成了:

let expectation = XCTestExpectation(description: "Location Service Alert")

let locationMonitorToken = addUIInterruptionMonitorWithDescription("Location Services")  
  (alert) -> Bool in
  alert.buttons["Allow"].tap()
  expectation.fulfill() // test waits for this before passing
  return true


app.buttons["Request Location"].tap()
app.tap() // alert triggered here
wait(for: [expectation], timeout: 3.0)
removeUIInterruptionMonitor(locationMonitorToken)

更新:触发警报后忘记输入wait(for: [expectation], timeout: 3.0) 以确保调用了处理程序。

【讨论】:

以上是关于XCUITest 验证 ui 中断处理程序发生的主要内容,如果未能解决你的问题,请参考以下文章

Verilog基础计算机体系架构CPU发生中断要做哪些事?什么是中断向量表?(面试常问)

中断和异常

软中断有优先级之分吗

[笨叔点滴12]面试必考:如果在中断处理函数里发生了缺页中断会怎样?为什么?

中断向量是啥意思

ARM中断深入分析几点