Я пишу интеграционные тесты в 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)
}
}
}
}
XCTestExpectation
(неXCTestException
), но и с техникой семафоров. например stackoverflow.com/a/23658385/1271826. Вы, вероятно, можете использовать технику семафоров для своего асинхронного кода базы данных (хотя вы не рассказали, как вы делаете этот материал базы данных, поэтому мы не можем быть более конкретными, чем это). Я удивлен, что в вашей библиотеке баз данных нет функции синхронизации, потому что это очень часто встречается в библиотеках баз данных. - person Rob   schedule 08.04.2015XCTestException
. ЭтоXCTestExpectation
. И, как я уже сказал, используйте технику семафоров вsetUp
, а не вXCTestExpectation
. (Используйте ожидания в тестах, но вsetUp
используйте семафоры.) - person Rob   schedule 08.04.2015