我有一个类,它是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。
答案 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