如何使测试方法等到委托完成处理?

Posted

技术标签:

【中文标题】如何使测试方法等到委托完成处理?【英文标题】:How can I cause test method to wait till delegate has finished processing? 【发布时间】:2012-01-19 22:52:44 【问题描述】:

我在 SenTestCase 类中有以下 Objective C 测试代码。我没有收到任何错误,但永远不会调用 httpReceiveDataFinished 方法。这是因为在委托有机会处理 http 方法之前测试就结束了吗?

如果是这种情况,我该如何分离一个线程(或类似的东西)以使测试等待几秒钟?

感谢一百万的帮助。我已经编写 Java 多年了,但 Objective-C 才几天。

- (void)testExample

    HttpClient *client = [[HttpClient alloc] init];
    client.method = METHOD_GET;
    client.followRedirects = YES;
    [client processRequest:@"http://google.com" delegate:self];
    NSLog(@"Test Over");


-(void) httpReceiveError:(NSError*)error 
    NSLog(@"***\n%@\n***",[error description]);


- (void) httpReceiveDataChunk:(NSData *)data 
    [self.httpResponseData appendData:data];


-(void) httpReceiveDataFinished 
    NSString *result = [[NSString alloc] 
        initWithData:self.httpResponseData 
        encoding:NSUTF8StringEncoding];
    NSLog(@"***\nRESULT: %@ \n***",result);

【问题讨论】:

***.com/questions/1077737/… 太棒了。像魅力一样工作。 【参考方案1】:

首先:Stanislav 的链接非常好。 对我自己来说,我需要一些更灵活(长时间运行)但也能在成功后立即通过测试的东西。 (大文件下载等。)

这是我的实用函数:

-(BOOL)runLooperDooper:(NSTimeInterval)timeoutInSeconds 
      optionalTestName:(NSString *)testName 

    NSDate* giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds];
    // loop until the operation completes and sets stopRunLoop = TRUE
    // or until the timeout has expired

    while (!stopRunLoop && [giveUpDate timeIntervalSinceNow] > 0) 
    
        // run the current run loop for 1.0 second(s) to give the operation code a chance to work
        NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:1.0];
        [[NSRunLoop currentRunLoop] runUntilDate:stopDate];
    

    STAssertTrue(stopRunLoop, 
                 @"%@ failed to finish before runloop expired after %f seconds", testName, timeoutInSeconds);
    return stopRunLoop;

在您的测试程序类中将 stopRunLoop 声明为 ivar。确保在 setUp 函数中将 stopRunLoop 重置为 FALSE,并在调用 [client processRequest:@"http://google.com" delegate:self]; 之前调用此函数。然后,在事件处理程序中,将 stopRunLoop 设置为 TRUE。

通过传递一个 testName,您可以将它重用于多个测试并获得一些有意义的错误消息。

编辑:99% 确定我的上述代码来自我目前找不到的另一篇 *** 帖子,或者我会链接它。

【讨论】:

以上是关于如何使测试方法等到委托完成处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何使python等到批处理执行完成

如何等到吐司完成?仅在 toast 隐藏 prev 测试后才开始第二次测试

如何为委托方法编写 GHunit 测试用例?

如何测试 UIAlertController 的完成处理程序中调用的方法?

等到setInterval()完成

Java如何限制作用于方法的线程数