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

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

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

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

所以我想用

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

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

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

谢谢!

【问题讨论】:

    标签: xcode swift unit-testing


    【解决方案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))))
      }
      

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 1970-01-01
        • 2018-01-29
        • 2018-03-11
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-26
        相关资源
        最近更新 更多