要测试这样的东西,您需要在测试中控制NSOperationQueue。
假设您正在测试的类名为MySubject。首先,您需要对其进行重构,以便我们可以注入一个NSOperationQueue--这将允许使用替换它进行测试。所以摆脱所有出现的[NSOperationQueue mainQueue] 并将它们替换为类变量。从MySubject 的构造函数中的参数初始化该类变量。因此,您必须更改 MySubject 的所有实例化以传递 [NSOperationQueue mainQueue]。
@interface MySubject: NSObject {
NSOperationQueue* operationQueue;
}
@end
@implementation MySubject
-(MySubject*)initWithOperationQueue:(NSOperationQueue*)queue {
if ( self = [super init] ) {
self.operationQueue = [queue retain];
}
return self;
}
-(void)dealloc {
[operationQueue release];
}
-(void)startOperations {
[operationQueue addOperation:...];
[operationQueue addOperation:...];
}
@end
客户端现在看起来像这样:
subject = [[MySubject alloc] initWithOperationQueue:[NSOperationQueue mainQueue]];
[subject startOperations];
现在对于测试,您可以创建一个简单的测试队列...它需要实现您的主题使用的任何方法。
@interface MyTestOperationQueue: NSMutableArray {
}
@end
@implementation MySubject
-(void)addOperation:(NSOperation*)operation {
[self addObject:operation];
}
@end
现在您的测试可以如下所示:
testQueue = [[MyTestOperationQueue alloc] init];
subject = [[MySubject alloc] initWithOperationQueue:testQueue];
[subject startOperations];
// You may want to have other tests that execute the queue operations
// in a different order
[[testQueue objectAtIndex:0] start];
[[testQueue objectAtIndex:0] waitUntilFinished];
[[testQueue objectAtIndex:1] start];
[[testQueue objectAtIndex:1] waitUntilFinished];
// Verify results
当然,这种测试无法验证并发操作是否可以安全地同时执行,但这可以涵盖很多您在尝试设计类时会感兴趣的情况.