Mic*_*uba 3 unit-testing objective-c nsoperationqueue ios 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
Run Code Online (Sandbox Code Playgroud)
一般来说,我知道如何使用 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");
}
Run Code Online (Sandbox Code Playgroud)
WAIT_WHILE 宏来自AGAsyncTestHelper。
我建议重新考虑您的测试策略。
但现在我想为 MyRequestsQueue 添加一个单元测试,检查队列当时是否只执行一个操作。或者甚至更好 - 测试当前正在执行的操作数不大于 maxConcurrentOperationCount。
这两个测试都会测试 Apple 的实现NSOperationQueue,这不会给你带来任何好处。你不想对不属于你的代码进行单元测试,一般来说你应该假设苹果已经正确地测试了他们自己的代码。如果NSOperationQueue运行的并发操作超过应有的数量,Apple 就会遇到大问题!
相反,我只是简单地测试在初始化后,您MyRequestsQueue已maxConcurrentOperationCount在其NSOperationQueue.
| 归档时间: |
|
| 查看次数: |
2069 次 |
| 最近记录: |