2016-03-31 6 views
4

Gibt es eine Möglichkeit zu warten, bis alle Netzwerkanforderungen beim Testen der Benutzeroberfläche in XCode abgeschlossen sind?Warten, bis alle HTTP-Anforderungen in XCode-UI-Tests abgeschlossen wurden?

Ich habe eine App, die HTTP-Anforderungen sendet, um einige Daten von einem Server zu erhalten, und in UI-Tests möchte ich warten, bis diese Daten abgerufen werden, bevor Sie fortfahren. Derzeit verwende ich sleep(1), aber dieser Ansatz scheint nicht zuverlässig.

Antwort

6

Am besten warten Sie, bis ein Element der Benutzeroberfläche erscheint oder verschwindet. Stellen Sie es sich so vor:

Das Framework verhält sich wie ein Benutzer. Es ist egal, welcher Code unter der Haube läuft. Es kommt nur darauf an, was auf dem Bildschirm sichtbar ist.

Das heißt, hier ist, wie Sie wait for a label titled "Go!" to appear in Ihre UI-Tests können.

let app = XCUIApplication() 
let goLabel = self.app.staticTexts["Go!"] 
XCTAssertFalse(goLabel.exists) 

let exists = NSPredicate(format: "exists == true") 
expectationForPredicate(exists, evaluatedWithObject: goLabel, handler: nil) 

app.buttons["Ready, set..."].tap() 
waitForExpectationsWithTimeout(5, handler: nil) 
XCTAssert(goLabel.exists) 

Sie könnten auch extract that into a helper method. Wenn Sie eine Swift-Compiler-Magie verwenden, können Sie sogar die Fehlermeldung in der Zeile namens der Methode erhalten.

private fund waitForElementToAppear(element: XCUIElement, file: String = #file, line: UInt = #line) { 
    let existsPredicate = NSPredicate(format: "exists == true") 
    expectationForPredicate(existsPredicate, evaluatedWithObject: element, handler: nil) 

    waitForExpectationsWithTimeout(5) { (error) -> Void in 
     if (error != nil) { 
      let message = "Failed to find \(element) after 5 seconds." 
      self.recordFailureWithDescription(message, inFile: file, atLine: line, expected: true) 
     } 
    } 
} 
+0

Vielen Dank für die Antwort! – Jeiwan

2

Sie können Ihre Methoden mit Delegaten oder Abschlussblöcken einrichten, und in Ihren Testfällen verwenden Sie eine XCTestExpectation, die Sie fulfill können, wenn die Daten zurückgegeben wurden.

Verwandte Themen