【发布时间】:2015-06-12 19:47:19
【问题描述】:
我正在 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)
}
}
}
}
【问题讨论】:
-
如果你在堆栈溢出中搜索“[ios] 异步单元测试”,你会看到大量的答案,不仅有
XCTestExpectation(不是XCTestException)技术,还有信号量技术.例如stackoverflow.com/a/23658385/1271826。您可能可以将信号量技术用于您的异步数据库代码(尽管您还没有分享您是如何处理这个数据库的,所以我们不能比这更具体)。我很惊讶您的数据库没有同步功能,因为这在数据库中很常见。 -
Rob,我编辑了我的问题以准确显示我在寻找什么。我确实知道如何使用 XCTest 和 XCTestException 来编写异步测试。我不知道如何在设置完成之前阻止测试运行。谢谢。
-
大声笑。同样,没有
XCTestException这样的东西。这是XCTestExpectation。正如我所说,在setUp中使用信号量技术,而不是XCTestExpectation。 (在测试中使用期望值,但在setUp中使用信号量。) -
Re: XCTestException --- 代码阅读障碍再次来袭!大声笑
-
是否可以将您的数据库设置代码放在辅助方法中?那么你每次测试只有一个重复的行。
标签: xcode unit-testing swift asynchronous xctest