gpt4 book ai didi

ios - 使用 maxConcurrentOperationCount 对 NSOperationQueue 进行单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:44:14 28 4
gpt4 key购买 nike

我有一个类,它是 NSOperationQueue 的一种包装器。它允许使用 block 对网络请求进行排队。目前请求是一个接一个执行的,但以后可以改变。

这是 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。我试图观察 self.queueoperationCount 属性,但是 documentation说我不应该依赖它。我怎样才能实现它?

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

@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 .

最佳答案

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

But now I want to add a unit test for MyRequestsQueue that checks if queue executes only one operation at the time. Or even better - test that number of currently executing operations is not greater than maxConcurrentOperationCount.

这两个测试都将测试 Apple 的 NSOperationQueue 实现,这不会给您带来任何好处。你不想成为你不拥有的单元测试代码,一般来说你应该假设 Apple 已经正确测试了他们自己的代码。如果 NSOperationQueue 运行的并发操作多于应有的数量,Apple 就会有大问题!

相反,我会简单地测试一下,在它初始化之后,您的 MyRequestsQueue 已经在其 NSOperationQueue 上设置了正确的 maxConcurrentOperationCount

关于ios - 使用 maxConcurrentOperationCount 对 NSOperationQueue 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21229905/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com