我在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);
}
答案 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帖子,或者我将其链接。