如何在XCTest中等待T秒而没有超时错误?

mea*_*ers 5 timeout wait ios xctest swift

我想将测试进度延迟T秒,而不会产生超时。

首先,我尝试了显而易见的方法:

sleep(5)
XCTAssert(<test if state is correct after this delay>)
Run Code Online (Sandbox Code Playgroud)

但这失败了。

然后我尝试了:

let promise = expectation(description: "Just wait 5 seconds")
waitForExpectations(timeout: 5) { (error) in
    promise.fulfill()

    XCTAssert(<test if state is correct after this delay>)
}
Run Code Online (Sandbox Code Playgroud)

XCTAssert()现在成功了。但是waitForExpectations()由于超时而失败。

这是根据XCTest等待函数的文档说的:

超时始终被视为测试失败。

我有什么选择?

And*_*lva 13

对我来说最有效的是:

let timeInSeconds = 2.0 // time you need for other tasks to be finished
let expectation = XCTestExpectation(description: "Your expectation")

DispatchQueue.main.asyncAfter(deadline: .now() + timeInSeconds) {
    expectation.fulfill()
}    

wait(for: [expectation], timeout: timeInSeconds + 1.0) // make sure it's more than what you used in AsyncAfter call.

//do your XCTAssertions here
XCTAssertNotNil(value)
Run Code Online (Sandbox Code Playgroud)


A.M*_*zer 10

您可以使用XCTWaiter.wait函数;例如:

 let exp = expectation(description: "Test after 5 seconds")
 let result = XCTWaiter.wait(for: [exp], timeout: 5.0)
 if result == XCTWaiter.Result.timedOut {
     XCTAssert(<test if state is correct after this delay>)
 } else {
     XCTFail("Delay interrupted")
 }
Run Code Online (Sandbox Code Playgroud)


Rob*_*art 9

如果您知道某件事需要多长时间,并且只想在继续测试之前等待该持续时间,您可以使用这一行:

_ = XCTWaiter.wait(for: [expectation(description: "Wait for n seconds")], timeout: 2.0)
Run Code Online (Sandbox Code Playgroud)