0

我有一段代码,同步和异步处理队列。我正在使用 OCMock 来测试这个东西,我可以单独测试这两种情况(同步和异步),但是当我同时测试这两种情况时,我遇到了麻烦。

为了验证队列是否被正确处理,我向它传递了一个模拟的侦听器,然后我从这个侦听器询问它是否得到了队列处理器传播的所有通知。我有两个测试,在第一个测试(异步)中,这些期望得到了满足,但是在第二个测试(同步)中,我得到了这个错误:

OCMockObject[JHQueueListener] : 4 expected methods were not invoked: 
        startedProcessingQueue
        startedToProcessQueueItem:OCMockObject[JHQueueItem]
        finishedProcessingQueueItem:OCMockObject[JHQueueItem]
        finishedProcessingQueue

这是该项目的链接: https ://github.com/jphollanti/queue-processor

这是测试的链接: https ://github.com/jphollanti/queue-processor/blob/master/QueueProcessorTests/JHQueueProcessorTests.m

4

1 回答 1

0

问题 #1:引用很好,但在测试方面,线程预计无法正常工作。这里的问题是启动了一个新线程,并且在该新线程中,队列的状态设置为进行中。但是启动一个新线程比主线程请求状态需要更长的时间,这导致队列(尚未)在进行中。添加大约 10000 毫秒的延迟应该会有很大帮助。像这样:

...
  [queue processQueueAsynchronously:queueItems];

  usleep(10000);

  BOOL wentToThread = NO;
  while ([queue isInProgress]) {
    wentToThread = YES;
    ...
  }
...

此外,打电话dispatch_async(dispatch_queue_t queue, ^(void)block)需要很多时间,这增加了问题的“随机”性质。

问题#2:从主线程调用dispatch_async(dispatch_get_main_queue(), ^{ ... }会导致块被发送到某个队列,该队列在某个时间执行(不知道它是如何工作的)。这就是第二次测试(同步)失败的原因。使用类似的东西有助于:

if ([NSThread isMainThread]) {
  for (id <JHQueueListener> listener in listeners) {
    [listener startedToProcessQueueItem:queueItem];
  }
} else {
  dispatch_async(dispatch_get_main_queue(), ^{
    for (id <JHQueueListener> listener in listeners) {
      [listener startedToProcessQueueItem:queueItem];
    }
  });
}
于 2013-03-31T20:18:04.020 回答