Как ждать в XCTest в течение T секунд без ошибки тайм-аута?
Я хочу отложить выполнение теста на T секунд, не генерируя тайм-аут.
Сначала я попробовал очевидное:
sleep(5)
XCTAssert(<test if state is correct after this delay>)
Но это не удалось.
Тогда я попробовал:
let promise = expectation(description: "Just wait 5 seconds")
waitForExpectations(timeout: 5) { (error) in
promise.fulfill()
XCTAssert(<test if state is correct after this delay>)
}
мой XCTAssert()
сейчас удалось. Но waitForExpectations()
не удалось с таймаутом.
Это согласно документации XCTest
функции ожидания говорят:
Тайм-аут всегда рассматривается как сбой теста.
Какие у меня варианты?
3 ответа
Решение
Вы можете использовать функции 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")
}
Если вы знаете, сколько времени что-то займет, и просто хотите подождать это время, прежде чем продолжить тест, вы можете использовать эту одну строку:
_ = XCTWaiter.wait(for: [expectation(description: "Wait for n seconds")], timeout: 2.0)
Что лучше всего сработало для меня:
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)