У меня есть класс, который является своего рода оболочкой для NSOperationQueue
. Это позволяет ставить в очередь сетевые запросы с помощью блоков. В настоящее время запросы выполняются один за другим, но это может быть изменено в будущем.
Вот код класса MyRequestsQueue:
@interface MyRequestsQueue ()
@property(nonatomic, strong) NSOperationQueue* queue;
@end
@implementation MyRequestsQueue
-(instancetype)init
{
self = [super init];
if(!self) {
return nil;
}
self.queue = [[NSOperationQueue new] autorelease];
self.queue.maxConcurrentOperationCount = 1;
return self;
}
-(void)addRequestBlock:(void (^)())request
{
NSBlockOperation* operation = [NSBlockOperation blockOperationWithBlock:request];
[self.queue addOperation:operation];
}
@end
В общем, я умею тестировать асинхронный код с помощью XCTest. Но теперь я хочу добавить модульный тест для MyRequestsQueue
, который проверяет, выполняет ли очередь только одну операцию за раз. Или еще лучше - проверить, что количество выполняемых в данный момент операций не превышает maxConcurrentOperationCount
. Я пытался наблюдать свойство operationCount
self.queue
, но документация говорит, что я не должен на это полагаться. Как я могу достичь этого?
РЕДАКТИРОВАТЬ: Мои тесты используют следующий шаблон:
@interface MessageRequestQueueTest : XCTestCase
@property(nonatomic, strong) MessageRequestsQueue* reuqestQueue;
@property(nonatomic, assign) NSInteger finishedRequestsCounter;
@end
// setUp method ommited - simply initializes self.requestQueue
-(void)testAddedRequestIsExecuted
{
[self.reuqestQueue.queue setSuspended:YES];
__weak __typeof(self) weakSelf = self;
[self.reuqestQueue addRequestBlock:^{
++weakSelf.finishedRequestsCounter;
} withName:kDummyRequestName];
[self.reuqestQueue.queue setSuspended:NO];
WAIT_WHILE(0 == self.finishedRequestsCounter, 0.1);
XCTAssertEqual(self.finishedRequestsCounter, 1, @"request should be executed");
}
макрос WAIT_WHILE взят из AGAsyncTestHelper.