1

为了在我的测试中添加延迟,我实现了这个:

func execute(after: TimeInterval, testBlock: () -> Void) {
    let result = XCTWaiter.wait(for: [expectation(description: "Delayed Test")], timeout: after)

    if result == XCTWaiter.Result.timedOut {
        testBlock()
    } else {
        XCTFail("Delay interrupted.")
    }
}

然后我写了一个测试:

func testExecute() {
    var i = 1

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.40) {
        i = 2
    }

    execute(after: 0.20) {
        XCTAssert(i == 1)
    }

    execute(after: 0.15) {
        XCTAssert(i == 1)   // Fails once every three or four runs.
    }

    execute(after: 0.06) {  // Never fails.
        XCTAssert(i == 2)
    }
}

为什么第二个XCTAssert()经常失败?

这是我的模拟器上唯一运行的东西。您预计会有一些抖动,但不应该保持 1/60 秒系统时钟周期的 1 或 2 倍吗?

4

1 回答 1

1

事实证明,延迟可能需要更长的时间(在 2011 年的这个实验中长达 200 毫秒:http: //atastypixel.com/blog/experiments-with-precise-timing-in-ios/)。

execute(after:testBlock:)使用此功能时必须留有足够的余量。

于 2018-05-09T10:55:40.510 回答