XCUITest 验证 ui 中断处理程序发生
XCUITest verify that ui interruption handler occurred
我是 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()
之后,如果警报从未被触发,我的处理程序将不会被调用。我需要测试警报是否确实发生,然后可能会向处理程序的内容添加一些断言
我似乎已经回答了我自己关于进一步调查的问题。对于使用 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)
以确保调用处理程序。
我是 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()
之后,如果警报从未被触发,我的处理程序将不会被调用。我需要测试警报是否确实发生,然后可能会向处理程序的内容添加一些断言
我似乎已经回答了我自己关于进一步调查的问题。对于使用 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)
以确保调用处理程序。