gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:24:50 28 4
gpt4 key购买 nike

在让 test() 方法运行之前,我需要执行多次调用。我有一个完成 block ,我正在使用 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() 等待返回多个异步调用?

最佳答案

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

正在附加 link到 Apple 文档。

编辑:请看下面的示例代码:

class CommonTests: XCTestCase {
var validate: XCTestExpectation? = nil

func testMytest() {
validate(completion: {
loadSomeStuff(completion: { (list: [Stuff]?) in
// actual test
}
})
}

func validate(completion: @escaping ()->()) {
self.validateExpectation = self.expectation(description: "Setup")
// async operation can be fired here
// or if already started from somewhere else just wait for it to complete


self.waitForExpectations(timeout: 60) { (error: Error?) in
XCTAssert((error == nil), error?.localizedDescription ?? "Failed with unknown error")
completion()
}
}

func validateAsyncCompleted() {
self.validateExpectation?.fulfill()
}

func loadStuff(completion: @escaping ([Stuff]?)->()) {

// possible place for assertion or some other checks

let expectation = self.expectation(description: "loading")
DispatchQueue.global().async {

let result: [Stuff]? = nil
// load operation

expectation.fulfill()
completion(result)
}

self.waitForExpectations(timeout: 90) { (error: Error?) in
XCTAssert((error == nil), error?.localizedDescription ?? "load - failed with unknown error")
}
}
}

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

关于ios - 在 XCTestCase 的 setUp() 中等待多个异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42277421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com