Unit-Tests in Swift schreiben, um asynchrone Aufgaben zu testen

Heute möchte ich Ihnen schnell erklären, wie Sie asynchronen Code testen.

Stellen Sie sich die Situation vor, in der Sie Daten aus dem Internet herunterladen und prüfen müssen, ob alles einwandfrei funktioniert oder ob eine andere Aufgabe asynchron ausgeführt wird. Und wie teste ich es? Was ist, wenn Sie das Gleiche wie bei normalem Synchroncode versuchen ?!

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

Ein solcher Test liefert ein positives Ergebnis, da die Methode nicht auf alle unsere asynchronen Aufgaben wartet.

Um ein solches Problem in den Tests zu lösen, gibt es eine großartige Sache: XCTestExpectation
XCTestExpectation legt fest, wie oft die asynchrone Methode ausgeführt werden soll. Erst nach all diesen Ausführungen wird der Test beendet und es wird festgestellt, ob Fehler aufgetreten sind. Hier ist ein Beispiel:

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

Ich hoffe, dieser Beitrag ist für jemanden hilfreich.

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


All Articles