Escrevendo testes de unidade no Swift para testar tarefas assíncronas

Hoje, quero lhe dizer rapidamente como testar código assíncrono.

Imagine a situação em que você precisa baixar dados da Internet e verifique se tudo funciona bem ou alguma outra tarefa que é executada de forma assíncrona. E como testá-lo? E se você tentar o mesmo que o código síncrono regular ?!

func testAscynFunction() { someAsyncFunction() } func someAsyncFunction() { let bg = DispatchQueue.global(qos: .background) bg.asyncAfter(deadline: .now() + 5) { XCTAssert(false, "Something went wrong") } } 

Esse teste nos retornará um resultado positivo, pois o método não aguardará todas as nossas tarefas assíncronas.

Para resolver esse problema nos testes, há uma grande coisa: XCTestExpectation
XCTestExpectation define quantas vezes o método assíncrono deve ser executado e somente após todas essas execuções o teste será encerrado e informará se houve algum erro. Aqui está um exemplo:

 class TestAsyncTests: XCTestCase { // 1)  expectation var expectation: XCTestExpectation! func testWithExpectationExample() { //2)   expectation = expectation(description: "Testing Async") //3)    ,     expectation.fulfill() expectation.expectedFulfillmentCount = 5 for index in 0...5 { someAsyncFunctionWithExpectation(at: index) } //5)      expectation.fulfill() //       60     ,     waitForExpectations(timeout: 60) { (error) in if let error = error { XCTFail("WaitForExpectationsWithTimeout errored: \(error)") } } } func someAsyncFunctionWithExpectation(at index: Int) { let bg = DispatchQueue.global(qos: .background) bg.asyncAfter(deadline: .now() + 5) { [weak self ] in XCTAssert(false, "Something went wrong at index \(index)") //4)      expectation.expectedFulfillmentCount self?.expectation.fulfill() } } } 

Espero que este post seja útil para alguém.

Source: https://habr.com/ru/post/pt439772/


All Articles