我目前在我的应用中添加了很多单元测试,以检查WS是否处于运行状态。
我完全知道如何使用expectations
在testMethod中等待。
我想要的不太常见。我有一个处理用户收藏夹数据的测试用例。为了确定该用户的状态,我想在案例之前创建一个全新的用户(而不是在每个测试之前)
所以我想用
public class func setUp() {
//call here WS ( async call )
}
我的问题是,因为我处于class
函数中,所以我无法使用expectation
和waitForExpectation
,因为这些是实例方法。
在执行测试之前,有没有人知道如何等待我的WS完成?
谢谢!
答案 0 :(得分:2)
您可以使用信号量技术来完成您想要的任务。
let fakeWSCallProcessingTimeInSeconds = 2.0
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(fakeWSCallProcessingTimeInSeconds * Double(NSEC_PER_SEC)))
let semaphore = dispatch_semaphore_create(0)
dispatch_after(delayTime, dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) {
dispatch_semaphore_signal(semaphore)
}
let timeoutInNanoSeconds = 5 * 1000000000
let timeout = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutInNanoSeconds))
if dispatch_semaphore_wait(semaphore, timeout) != 0 {
XCTFail("WS operation timed out")
}
此代码将伪造一个2秒延迟(dispatch_after)的Web服务调用,在您的情况下应该用实际调用替换。一旦完成调用并设置了用户对象,就可以使用" dispatch_semaphore_signal(semaphore)"释放信号量对象。如果它在5秒内无法使用(请参阅 timeoutInNanoSeconds ),则测试将被视为失败。显然,您可以根据需要更改值。
其余测试将在信号量空闲或超时发生后运行。
有关信号量的更多信息,请参阅Apple docs。
答案 1 :(得分:1)
我自己找到了。我不应该使用期望,因为设置部分不是测试的一部分。
我应该使用dispatch_group
:
override class func setUp() {
super.setUp()
let group = dispatch_group_create()
dispatch_group_enter(group)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let account = MyAccount()
WS.worker.createAccount(account, password: "test") { (success, error) in
dispatch_group_leave(group)
}
}
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, Int64(50 * Double(NSEC_PER_SEC))))
}