Écriture de tests unitaires dans Swift pour tester des tâches asynchrones

Aujourd'hui, je veux vous dire rapidement comment tester le code asynchrone.

Imaginez la situation dont vous avez besoin pour télécharger des données à partir d'Internet et vérifier si tout fonctionne bien, ou une autre tâche qui s'exécute de manière asynchrone. Et comment le tester? Que faire si vous essayez la même chose que le code synchrone ordinaire?!

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

Un tel test nous retournera un résultat positif, car la méthode n'attendra pas toutes nos tâches asynchrones.

Pour résoudre un tel problème dans les tests, il y a une grande chose: XCTestExpectation
XCTestExpectation définit le nombre de fois que la méthode asynchrone doit être exécutée et seulement après toutes ces exécutions, le test se terminera et indiquera s'il y a eu des erreurs. Voici un exemple:

 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() } } } 

J'espère que ce message est utile à quelqu'un.

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


All Articles