0

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

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)
      }
    }    
}  
4

1 回答 1

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,因此您不必更改未利用新完成处理程序的其余代码。

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

于 2021-10-17T19:49:44.770 回答