等待期望时使用XCTFail不会阻止超时

Nat*_*ton 0 xcode xctest

运行异步操作的XCTest时,调用XCTFail()不会立即使测试失败,这是我的期望。取而代之的是,从到的剩余任何超时时间都会wait首先耗尽,这不必要地延长了测试时间,并且还会创建一个令人困惑的失败消息,表明由于超时而导致测试失败,而实际上却明确地失败了。

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

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

    wait(for: [x], timeout: 5)
}
Run Code Online (Sandbox Code Playgroud)

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

由于我没有通过Google或stackoverflow搜索找到关于此的任何提及,因此我分享了一个发现的解决方法。

Nat*_*ton 6

我发现XCTestExpectation在调用后仍然可以实现XCTFail(),这不算作通过,而是立即使过期wait。因此,将其应用于我的初始示例:

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    XCTFail("bar")
    x.fulfill()
}
Run Code Online (Sandbox Code Playgroud)

这可能是Apple期望的,但对我而言并不直观,而且我在任何地方都找不到文档。因此,希望这可以节省别人花时间让我感到困惑的时间。