0

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

我想出了如何检查这个:

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

1 回答 1

0

为 AFNetworking 调用完成异步单元测试的一种方法是使用GHUnit

GHUnit 处理旋转运行循环并等待异步操作自动完成,因此您的单元测试代码可以更具可读性。

这是一个基本教程,涵盖了一起使用 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...
}

希望有帮助!

于 2013-04-22T22:06:55.973 回答