等待XCTestCase的setUp()中的多个异步调用

时间:2017-02-16 14:56:14

标签: ios swift asynchronous xctestcase

我需要在运行test()方法之前执行多次调用。我有一个完成块,我正在使用waitForExpectations()。由于我使用计数器进行了多次异步调用。我让expectation.fulfill()只在计数器达到通话次数时才会发生。

override func setUp() {
    super.setUp()

    let exp = expectation(description: "waitForSetUp")
    var counter = 0

    // Issue an async request
    self.addEventToCalendar(title: "Test1", description: "Description test1", startDate: NSDate().addingTimeInterval(-36000), endDate: NSDate()){(success, error) in
        if (success) && (error == nil) {
            counter = counter + 1
            if(counter == 2){exp.fulfill()}
        }
    }

    self.addEventToCalendar(title: "Test2", description: "Description test2", startDate: NSDate(), endDate: NSDate().addingTimeInterval(36000)){(success, error) in
        if (success) && (error == nil) {
            counter = counter + 1
            if(counter == 2){exp.fulfill()}
        }
    }

    waitForExpectations(timeout: 40, handler: nil)        
}

这种结构不起作用。 test()方法有时会在调用返回之前运行(并非总是如此)。

如何让setUp()等待返回多个异步调用?

1 个答案:

答案 0 :(得分:1)

我遇到了类似的情况。我最终做的解决方案是调用多个函数,这些函数增加了对我的先决条件的期望,并将期望的超时设置为合理的值。在期望的完成处理程序中,我触发了我的设置算法的下一步。在所有预备步骤通过后,我开始实际的测试逻辑。

link附加到Apple文档。

编辑:请参阅下面的示例代码:

ARCamera

注意:期望有两种方法,第一种期望保存在变量中,因此可以根据需要从另一个函数中实现,另一种是在函数体中本地创建并从闭包中完成。