如何使测试方法等到委托完成处理?
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% 确定我的上述代码来自我目前找不到的另一篇 *** 帖子,或者我会链接它。
【讨论】:
以上是关于如何使测试方法等到委托完成处理?的主要内容,如果未能解决你的问题,请参考以下文章
如何等到吐司完成?仅在 toast 隐藏 prev 测试后才开始第二次测试