Как написать iOS Unit Testing в SwiftUI при переключении с фонового потока на основной поток - PullRequest
0 голосов
/ 22 апреля 2020

Когда моя фоновая операция завершена, мне нужно вызвать функцию handleError. Поскольку isToast, errorMessage являются опубликованными переменными, мне нужно поместить их в основной поток. Я написал забавный c для теста test__Failure (), но перед завершением simulateRequestFailure эта строка выполняется в функции XCTAssertTrue (self.viewModel.isToast). Как поставить ожидание, задержка на несколько секунд

@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)

    }

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете отложить проверку и проверить ее также в основном потоке, примерно так:

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 se c на любое другое)
  • simulateRequestFailure() работает в основном потоке асинхронно, поэтому мы позволяем ему запускаться и график проверки в том же потоке, но немного задержанный (на 1 сек c, но вы можете изменить его на любой другой смысл)
...