在等待期望时使用 XCTFail 并不能防止超时

Posted

技术标签:

【中文标题】在等待期望时使用 XCTFail 并不能防止超时【英文标题】:Using XCTFail when waiting on an expectation does not prevent timeout 【发布时间】:2018-02-07 17:23:36 【问题描述】:

在运行异步操作的 XCTest 时,调用 XCTFail() 不会立即使测试失败,这是我的预期。相反,调用wait 后剩余的任何超时时间都会先用完,这会不必要地延长测试时间,并且还会创建一个令人困惑的失败消息,暗示测试由于超时而失败,而实际上它显式失败了。

func testFoo() 
    let x = expectation(description: "foo")

    DispatchQueue.main.asyncAfter(deadline: .now() + 2) 
        XCTFail("bar")
    

    wait(for: [x], timeout: 5)

在上面的示例中,虽然失败发生在大约 2 秒后,但直到 5 秒的超时时间过去后测试才完成。当我第一次注意到这种行为时,我以为我做错了什么,但这似乎只是它的工作方式,至少在当前版本的 Xcode (9.2) 中是这样。

由于我没有通过 google 或 *** 搜索找到任何提及这一点,因此我分享了我找到的解决方法。

【问题讨论】:

【参考方案1】:

我发现调用XCTFail()后XCTestExpectation仍然可以实现,这不算通过并且立即过期wait。所以,把它应用到我最初的例子中:

DispatchQueue.main.asyncAfter(deadline: .now() + 2) 
    XCTFail("bar")
    x.fulfill()

这可能是 Apple 所期望的,但对我来说并不直观,而且我无法在任何地方找到它的文档。所以希望这可以节省其他人我困惑的时间。

【讨论】:

是的。正如我在qualitycoding.org/asynchronous-tests 中总结的那样,块的工作是捕获信息并触发实现。 @JonReid 好文章。感谢分享!只希望我能早点找到它。

以上是关于在等待期望时使用 XCTFail 并不能防止超时的主要内容,如果未能解决你的问题,请参考以下文章

ssh 防止超时掉线

防止 .Net 服务重新启动时数据丢失

易语言外部判断程序超时防卡住

函数防抖VS函数节流

留言板防灌水功能应该怎么做?怎么防止sql注入?用PHP编写

QSslSocket 等待数据时超时(但 QTcpSocket 不会)