在等待期望时使用 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 并不能防止超时的主要内容,如果未能解决你的问题,请参考以下文章