Я пишу интеграционные тесты в Xcode 6, чтобы идти вместе с моим модулем и функциональными тестами. XCTest имеет метод setUp(), который вызывается перед каждым тестом. Большой!
Он также имеет XCTestException, которые позволяют мне писать асинхронные тесты. Также отлично!
Однако я хотел бы заполнить тестовую базу данных тестовыми данными перед каждым тестом, и setUp только начинает выполнение тестов до того, как будет выполнен вызов асинхронной базы данных.
Есть ли способ, чтобы setUp подождал, пока моя база данных не будет готова, прежде чем запускать тесты?
Вот пример того, что я сейчас делаю. Поскольку setUp возвращается до заполнения базы данных, я должен дублировать много тестового кода для каждого теста:
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)
}
}
}
Вот что мне хотелось бы:
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)
}
}
}
}