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

Posted

技术标签:

【中文标题】Xcode 单元测试,在 `class setUp()` 中等待【英文标题】:Xcode Unit Testing, wait in `class setUp()` 【发布时间】:2016-06-08 07:35:55 【问题描述】:

我目前正在我的应用程序中添加大量单元测试,以检查 WS 是否处于运行状态。

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

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

所以我想用

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

我的问题是,因为我在 class 函数中,所以我不能使用 expectationwaitForExpectation,因为它们是实例方法。

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

谢谢!

【问题讨论】:

【参考方案1】:

你可以使用信号量技术来完成你想要的。

        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找到。

【讨论】:

【参考方案2】:

我自己找到的。我不应该使用期望,因为设置部分不是测试的一部分。

我应该改用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))))

【讨论】:

以上是关于Xcode 单元测试,在 `class setUp()` 中等待的主要内容,如果未能解决你的问题,请参考以下文章

为 Xcode 项目创建单元测试会导致错误:显示最近的消息:-1:未定义符号:_OBJC_CLASS_$_FBSDKCodelessIndexer

ABAP和Java的单元测试Unit Test

在使用 Cocoapods 的项目中执行单元测试时,“两个都实现了 Class X”

在单元测试 setUp 方法中调用路径辅助函数会引发错误

Python 单元测试 之setUP() 和 tearDown()

单元测试框架unittest