我正在尝试对我的代码进行一些单元测试。 我正面临一个问题,单元测试功能并不等待异步请求完成。我只是在测试时才会等待它,而不是在我运行它时。
我想出了如何检查这个:
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");
}
}
}
答案 0 :(得分:0)
完成AFNetworking调用的异步单元测试的一种方法是使用GHUnit。
GHUnit处理旋转runloop并等待异步操作自动完成,因此您的单元测试代码可以更具可读性。
以下是basic tutorial,其中包括AFNetworking,GHUnit和CocoaPods。
这是使用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...
}
希望有所帮助!