在操作队列中为函数写xctest



我有一个函数如下,它向操作队列添加了一个操作,我如何测试正在添加到操作队列的代码块,我尝试通过传递一个分析观察者间谍并检查值是否设置,但它似乎不起作用,请指出我在正确的方向

func firePendingEvent() {
for analyticItem in eventQueue {
eventPriorityQueue.addOperationToQueue (operation: BlockOperation {
self.analyticsObserver?.logEvent(event: analyticItem) // write test to check the event inside this function
}, priority: .normal)
if eventQueue.count > 0 {
eventQueue.remove(at: 0)
}
}    
}  

基本思想是您的测试必须创建一个期望:

let e = expectation(description: "testGetUsers")

然后当你的异步方法完成时,满足这个期望:

e.fulfill()

然后,当然,您的测试必须,在初始化异步任务之后,等待期望:

waitForExpectations(timeout: 10)

但是,很明显,您需要知道您的函数何时完成。我建议给它一个可选的完成处理程序:

func firePendingEvent(completion: (() -> Void)? = nil) {
let group = DispatchGroup()
for analyticItem in eventQueue {
group.enter()
eventPriorityQueue.addOperationToQueue(operation: BlockOperation {
self.analyticsObserver?.logEvent(event: analyticItem)
group.leave()
}, priority: .normal)
}
eventQueue.removeAll()
if let completion = completion {
group.notify(queue: .main, execute: completion)
}
}

(注意,我个人避免在迭代数组时改变数组,因此我将所有任务添加到队列中,并延迟removeAll,直到不再迭代。)

无论如何,你现在可以写你的测试:

func testFirePendingEvents() {
let e = expectation(description: "testGetUsers")
foo.firePendingEvent {
XCAssert(…) // do whatever tests are appropriate
e.fulfill()
}
waitForExpectations(timeout: 10)
}

但是,由于该完成处理程序是可选的,并且默认为nil,因此您不必更改未使用新完成处理程序的其余代码。

就我个人而言,我会在完成处理程序闭包中添加一个参数来传递你想要测试的任何值,但问题中没有足够的参数来知道你正在测试的结果。

最新更新