Sto scrivendo test di integrazione in Xcode 6 per andare a fianco dei miei test unitari e funzionali. XCTest ha un metodo setUp() che viene chiamato prima di ogni test. Grande!Come posso ottenere XCTest per attendere chiamate asincrone in setUp prima dell'esecuzione dei test?
Ha anche XCTestException che consente di scrivere test asincroni. Ottimo anche!
Tuttavia, desidero popolare il mio database di test con i dati di test prima di ogni test e setUp inizia a eseguire i test prima che venga eseguita la chiamata al database asincrono.
C'è un modo per impostare setUp fino a quando il mio database non è pronto prima di eseguire i test?
Ecco un esempio di ciò che ho fatto ora. Dal momento che i rendimenti programma di installazione prima il database è popolando devo duplicare un sacco di codice di prova ogni prova:
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)
}
}
}
Ecco quello che vorrei:
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)
}
}
}
}
se si cerca Stack Overflow per "[ios] unit test asincrona" vedrete un sacco di risposte non solo con la (non 'XCTestException') tecnica' XCTestExpectation', ma anche la tecnica del semaforo. per esempio. http://stackoverflow.com/a/23658385/1271826. Probabilmente puoi usare la tecnica del semaforo per il tuo codice di database asincrono (anche se non hai condiviso come stai facendo questo database così non possiamo essere più specifici di quello). Sono sorpreso che la tua libreria di database non abbia una funzione sincrona, perché è molto comune nelle librerie di database. – Rob
Rob, ho modificato la mia domanda per mostrare esattamente quello che sto cercando. So come utilizzare XCTest e XCTestException per scrivere test asincroni. Quello che non so è come mantenere i test in esecuzione fino al setUp. Grazie. –
Lol. Di nuovo, niente di simile a 'XCTestException'. È 'XCTestExpectation'. E come ho detto, usa la tecnica del semaforo in 'setUp', non' XCTestExpectation'. (Usa le aspettative nei test, ma in 'setUp' usa i semafori.) – Rob