Ich schreibe Integrationstests in Xcode 6, um sie mit meinen Unit- und Funktionstests zu kombinieren. XCTest hat eine setUp() -Methode, die vor jedem Test aufgerufen wird. Groß!Wie kann ich XCTest auf Async-Aufrufe in Setup warten, bevor Tests ausgeführt werden?
Es hat auch XCTestException, die mich Async-Tests schreiben lassen. Auch toll!
Allerdings möchte ich meine Testdatenbank vor jedem Test mit Testdaten füllen und setUp startet gerade Tests, bevor der asynchrone Datenbankaufruf durchgeführt wird.
Gibt es eine Möglichkeit zu warten, bis meine Datenbank bereit ist, bevor es Tests ausführt?
Hier ist ein Beispiel von dem, was ich jetzt mache. Da setUp kehrt vor der Datenbank gemacht werden bevölkert Ich habe eine Menge von Test-Code kopieren jeden Test:
func test_checkSomethingExists() {
let expectation = expectationWithDescription("")
var expected:DatabaseItem
// Fill out a database with data.
var data = getData()
overwriteDatabase(data, {
// Database populated.
// Do test... in this pseudocode I just check something...
db.retrieveDatabaseItem({ expected in
XCTAssertNotNil(expected)
expectation.fulfill()
})
})
waitForExpectationsWithTimeout(5.0) { (error) in
if error != nil {
XCTFail(error.localizedDescription)
}
}
}
Hier ist, was würde Ich mag:
class MyTestCase: XCTestCase {
override func setUp() {
super.setUp()
// Fill out a database with data. I can make this call do anything, here
// it returns a block.
var data = getData()
db.overwriteDatabase(data, onDone:() ->() {
// When database done, do something that causes setUp to end
// and start running tests
})
}
func test_checkSomethingExists() {
let expectation = expectationWithDescription("")
var expected:DatabaseItem
// Do test... in this pseudocode I just check something...
db.retrieveDatabaseItem({ expected in
XCTAssertNotNil(expected)
expectation.fulfill()
})
waitForExpectationsWithTimeout(5.0) { (error) in
if error != nil {
XCTFail(error.localizedDescription)
}
}
}
}
Wenn Sie Überlauf Suche Stack für „[ios] asynchronen Unit-Test“ Sie werden eine Menge Antworten sehen nicht nur mit der 'XCTestExpectation' (nicht' XCTestException') Technik, sondern auch die Semaphore Technik. z.B. http://StackOverflow.com/a/23658385/1271826. Sie können wahrscheinlich die Semaphor-Technik für Ihren asynchronen Datenbankcode verwenden (obwohl Sie nicht angegeben haben, wie Sie diesen Datenbankkram machen, so dass wir nicht spezifischer sein können). Ich bin überrascht, dass Ihre Datenbankbibliothek kein synchrones Feature hat, weil das in Datenbankbibliotheken sehr häufig ist. – Rob
Rob, ich habe meine Frage bearbeitet, um genau zu zeigen, wonach ich suche. Ich weiß, wie man XCTest und XCTestException benutzt, um async Tests zu schreiben. Was ich nicht weiß, ist, wie man die Tests so lange laufen lässt, bis setUp fertig ist. Vielen Dank. –
Lol. Auch hier gibt es keine "XCTestException". Es ist 'XCTestExpectation'. Und wie gesagt, benutze Semaphortechnik in 'setUp', nicht' XCTestExpectation'. (Verwenden Sie Erwartungen in den Tests, aber in 'setUp' Semaphore verwenden.) – Rob