AFJsonRequest和单元测试需要同步请求,

时间:2013-04-22 14:21:57

标签: objective-c unit-testing afnetworking synchronous

我正在尝试对我的代码进行一些单元测试。 我正面临一个问题,单元测试功能并不等待异步请求完成。我只是在测试时才会等待它,而不是在我运行它时。

我想出了如何检查这个:

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");
    }
}
}

1 个答案:

答案 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...
}

希望有所帮助!