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

时间:2012-01-19 22:52:44

标签: objective-c unit-testing delegates

我在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);
}

1 个答案:

答案 0 :(得分:0)

第一:斯坦尼斯拉夫的联系非常好。 对于我自己,我需要一些更灵活的东西(长时间运行),但也会在成功时立即通过测试。 (大文件下载等。)

这是我的效用函数:

-(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%确定我将上述代码基于另一个我目前无法找到的StackOverflow帖子,或者我将其链接。