当我的后台操作完成后,我需要调用handleError函数。由于isToast,errorMessage是发布的变量,我需要放在主线程中。我为test__Failure()写了一个func,但是在simulateRequestFailure完成之前,这一行在函数XCTAssertTrue(self.viewModel.isToast)中执行。如何把wait,延迟几秒
@Published var isToast: Bool = false
@Published var eMessage: String = ""
func handleError() {
DispatchQueue.main.async {
self.isToast = true
self.eMessage = “Test message”
}
}
func test__Failure() {
// Some simulate response which call handleError
self.simulateRequestFailure()
XCTAssertTrue(self.vm.isToast)
}
你可以延迟验证并在主线程上检查它,就像这样。
let expectation = XCTestExpectation()
self.simulateRequestFailure()
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
XCTAssertTrue(self.vm.isToast)
expectation.fulfill()
}
wait(for: [expectation], timeout: 10.0)
这样做的目的是:
Expectation
允许测试线程与主线程同步 main
线程。即测试要到以下两种情况才能完成 expectation.fulfill()
发生,或者10秒过期(当然你也可以把10秒改成任何东西)。simulateRequestFailure()
在主线程上异步运行,所以我们让它在同一个线程上运行并安排验证,但有点延迟(延迟1秒,但你可以把它改成任何有意义的线程)。