从后台线程切换到主线程时,如何在SwiftUI中编写iOS单元测试?

问题描述 投票:0回答:1

当我的后台操作完成后,我需要调用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)

    }
ios swift swiftui xctest
1个回答
0
投票

你可以延迟验证并在主线程上检查它,就像这样。

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秒,但你可以把它改成任何有意义的线程)。
© www.soinside.com 2019 - 2024. All rights reserved.