菜鸟教程小白 发表于 2022-12-13 05:59:48

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


                                            <p><p>我有一个类,它是 <code>NSOperationQueue</code> 的一种包装器。它允许使用 block 将网络请求排入队列。当前请求是一个接一个地执行,但是将来可以更改。</p>

<p>下面是 MyRequestsQueue 类的代码:</p>

<pre><code>@interface MyRequestsQueue ()

@property(nonatomic, strong) NSOperationQueue* queue;

@end

@implementation MyRequestsQueue

-(instancetype)init
{
    self = ;
    if(!self) {
      return nil;
    }

    self.queue = [ autorelease];
    self.queue.maxConcurrentOperationCount = 1;

    return self;
}

-(void)addRequestBlock:(void (^)())request
{
    NSBlockOperation* operation = ;
    ;
}

@end
</code></pre>

<p>一般来说,我知道如何使用 XCTest 对异步代码进行单元测试。但现在我想为 <code>MyRequestsQueue</code> 添加一个单元测试,以检查队列当时是否只执行一个操作。甚至更好 - 测试当前执行的操作数不大于 <code>maxConcurrentOperationCount</code>。我试图观察 <code>self.queue</code> 的 <code>operationCount</code> 属性,但是 <a href="https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperationQueue/operationCount" rel="noreferrer noopener nofollow">documentation</a>说我不应该依赖它。我怎样才能实现它?</p>

<p>编辑:我的测试使用以下模式:</p>

<pre><code>@interface MessageRequestQueueTest : XCTestCase

@property(nonatomic, strong) MessageRequestsQueue* reuqestQueue;
@property(nonatomic, assign) NSInteger finishedRequestsCounter;

@end
// setUp method ommited - simply initializes self.requestQueue


-(void)testAddedRequestIsExecuted
{
    ;

    __weak __typeof(self) weakSelf = self;
    [self.reuqestQueue addRequestBlock:^{
      ++weakSelf.finishedRequestsCounter;
    } withName:kDummyRequestName];

    ;

    WAIT_WHILE(0 == self.finishedRequestsCounter, 0.1);
    XCTAssertEqual(self.finishedRequestsCounter, 1, @&#34;request should be executed&#34;);
}
</code></pre>

<p>WAIT_WHILE 宏来自 <a href="https://github.com/hfossli/AGAsyncTestHelper" rel="noreferrer noopener nofollow">AGAsyncTestHelper</a> .</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我建议您重新考虑您的测试策略。 </p>

<blockquote>
<p>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.</p>
</blockquote>

<p>这两个测试都将测试 Apple 的 <code>NSOperationQueue</code> 实现,这不会为您带来任何好处。你不想成为你不拥有的单元测试代码,通常你应该假设苹果已经正确地测试了他们自己的代码。如果 <code>NSOperationQueue</code> 运行的并发操作比它应该运行的多,Apple 就会有大问题!</p>

<p>相反,我只是测试一下,在它被初始化之后,您的 <code>MyRequestsQueue</code> 已在其 <code>NSOperationQueue</code> 上设置了正确的 <code>maxConcurrentOperationCount</code>。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 maxConcurrentOperationCount 对 NSOperationQueue 进行单元测试,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/21229905/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/21229905/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 maxConcurrentOperationCount 对 NSOperationQueue 进行单元测试