我正在尝试对我的代码进行一些单元测试。我正面临着一个问题,单元测试函数并没有等待异步请求完成。我只想在测试时等待它,而不是在我运行它的时候。
我想出了如何检查这个:
if([[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"] isEqualToString:@"TEST"])在我的项目中设置了相应的环境变量。但是我找不到合适的方式来等待它。我尝试了一个信号量,这是有效的,但我想知道是否有任何其他方法会更简单,更友好的读者。
编辑:
最后,我这样做了:我想我本可以做得更好,但这对我来说是有效的,看起来也足够公平。
static int statusCode;
- (void)requestContent:(NSString*)urlString
{
statusCode = 0;
NSLog(@"Request Content");
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
[self ParseGoogleImageSearchResponse:JSON];
statusCode = 1;
NSLog(@"Done");
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
{
NSLog(@"%@", [error userInfo]);
statusCode = 2;
}];
[operation start];
if([[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"] isEqualToString:@"TEST"])
{
while(statusCode == 0)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
NSLog(@"WAITING");
}
}
}发布于 2013-04-23 06:06:56
完成AFNetworking调用的异步单元测试的一种方法是使用GHUnit。
GHUnit处理运行循环的旋转和等待异步操作自动完成,因此您的单元测试代码的可读性更好。
这是一个使用AFNetworking和GHUnit编写的基本测试。
- (void)test
{
[self prepare];
__block NSError *responseError = nil;
__block id resposeObject = nil;
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
resposeObject = JSON;
[self notify:kGHUnitWaitStatusSuccess forSelector:_cmd];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
{
responseError = error
[self notify:kGHUnitWaitStatusSuccess forSelector:_cmd];
}];
[operation start];
// Wait for the async activity to complete
[self waitForStatus:kGHUnitWaitStatusSuccess timeout:kNetworkTimeout];
// Check Error
GHAssertNil(responseError, @"");
GHAssertNotNil(resposeObservation, @"Response Observation is nil");
// Validate data...
}希望这能有所帮助!
https://stackoverflow.com/questions/16149523
复制相似问题