等待带有完成处理程序的*特定*(单个)XCTestExpectation?

Posted

技术标签:

【中文标题】等待带有完成处理程序的*特定*(单个)XCTestExpectation?【英文标题】:Wait for a *specific* (single) XCTestExpectation with a completion handler? 【发布时间】:2019-11-29 23:43:02 【问题描述】:

有没有人设法等待具有类似于 (waitForExpectations:timeout:handler)[https://developer.apple.com/documentation/xctest/xctestcase/1500748-waitforexpectations] 的完成处理程序(XCWaitCompletionHandler 或等效项)的特定、单个 XCTestExpectation

我只想等待一个特定的期望,但我想知道它是否超时。 XCWaitCompletionHandler 给了我这些信息。但是期望本身没有属性来标记它是否超时。

(是的,这是一个相当高级的用例……)

【问题讨论】:

我试着聪明一点,从可选的testRun 中读出 failedTestCases 计数,我的想法是检查它是否增加了 1,如果是,则可能因超时而失败。但是意识到并行运行多个测试是不可靠的?也许使用DispatchQueue.main.sync 另一个“太聪明”的尝试是将assertForOverFulfill 设置为true 并在之后调用fulfill,但不确定如何捕获aassert? (意思是没有失败)。 【参考方案1】:

创建一个XCTWaiter 并使用wait(for:timeout:),它返回一个XCTWaiter.Result,然后您可以根据需要断言是/不是.timedOut,或者对结果采取其他措施。通过使用XCTWaiter,您可以有一个预期超时,而测试不会自动失败。

let result = XCTWaiter().wait(for: [expectation], timeout: 5)
if result == .timedOut  ... 

【讨论】:

以上是关于等待带有完成处理程序的*特定*(单个)XCTestExpectation?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中等待单个事件,带有超时和取消

如何使用 xctest 滚动到特定位置

XCTest - 等待谓词失败

遇到 failureException 时如何在 XCTest 中停止等待

从不同的 VC 访问时,带有完成处理程序的 API 调用函数崩溃

XCTest 如何执行 segue 呈现模态视图并测试presentedViewController