我正在用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)
}
}
}
}
3条答案
按热度按时间uurity8g1#
您可以使用在异步测试用例中使用的相同的
waitForExpectationsWithTimeout:handler:
函数,而不是使用信号量或阻塞循环。oo7oh9g92#
有两种技术可以运行异步测试:
XCTestExpectation
和信号量。在setUp
中执行异步测试时,应该使用信号量技术:注意,要使其工作,这个
onDone
块不能在主线程上运行(否则会死锁)。如果这个
onDone
块在主队列上运行,则可以使用run循环:这是一种效率非常低的模式,但根据
overwriteDatabase
的实现方式,它可能是必要的注意,只有当您知道
onDone
块在主线程上运行时才使用此模式(否则您必须对finished
变量进行一些同步)。5cnsuln73#
雨燕4.2
使用此扩展名:
和用法是这样的:
上面的例子并不完整,但是你可以理解这个想法。希望这对你有所帮助。