使用maxConcurrentOperationCount对NSOperationQueue进行单元测试

时间:2014-01-20 09:06:04

标签: ios objective-c unit-testing nsoperationqueue xctest

我有一个类,它是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的{​​{1}}属性,但documentation说我不应该依赖它。我怎样才能实现它?

编辑:我的测试使用以下模式:

self.queue

WAIT_WHILE宏来自AGAsyncTestHelper

2 个答案:

答案 0 :(得分:3)

我建议您重新考虑您的测试策略。

  

但现在我想为MyRequestsQueue添加一个单元测试,用于检查队列当时是否只执行一个操作。甚至更好 - 测试当前正在执行的操作数量不超过maxConcurrentOperationCount。

这两项测试都将测试Apple的NSOperationQueue实施,这对你不会有任何好处。您不希望成为您不拥有的单元测试代码,通常您应该假设Apple已正确测试了自己的代码。如果NSOperationQueue运行的并发操作多于应有的,那么Apple就会遇到大问题!

相反,我只是在初始化后测试,MyRequestsQueue已在其maxConcurrentOperationCount上设置了正确的NSOperationQueue

答案 1 :(得分:1)

会有帮助吗?检查count属性。

@interface MyRequestsQueue ()

@property(nonatomic, strong) NSOperationQueue* queue;
@property(assign) NSUInteger count ;

@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:^{
        ++self.count ;
        request() ;
        --self.count ;
    }] ;
    [self.queue addOperation:operation];
}

@end