Xcode单元测试,在`class setUp()`中等待

时间:2016-06-08 07:35:56

标签: xcode swift unit-testing

我目前在我的应用中添加了很多单元测试,以检查WS是否处于运行状态。

我完全知道如何使用expectations在testMethod中等待。

我想要的不太常见。我有一个处理用户收藏夹数据的测试用例。为了确定该用户的状态,我想在案例之前创建一个全新的用户(而不是在每个测试之前)

所以我想用

public class func setUp() {
  //call here WS ( async call )
}

我的问题是,因为我处于class函数中,所以我无法使用expectationwaitForExpectation,因为这些是实例方法。

在执行测试之前,有没有人知道如何等待我的WS完成?

谢谢!

2 个答案:

答案 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))))
}
相关问题