当运行异步操作的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或stackoverflow搜索找到任何提及,我正在分享我找到的解决方法。
答案 0 :(得分:6)
我发现在调用XCTFail()
之后仍然可以实现XCTestExpectation,这不会算作传递并立即使wait
到期。所以,将此应用于我的初始示例:
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
XCTFail("bar")
x.fulfill()
}
这可能是Apple所期望的,但对我来说并不直观,我无法在任何地方找到它。所以希望这可以节省别人我迷茫的时间。