首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步请求的AFJsonRequest和单元测试需求

同步请求的AFJsonRequest和单元测试需求
EN

Stack Overflow用户
提问于 2013-04-22 22:21:57
回答 1查看 293关注 0票数 0

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

我想出了如何检查这个:

代码语言:javascript
复制
if([[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"] isEqualToString:@"TEST"])

在我的项目中设置了相应的环境变量。但是我找不到合适的方式来等待它。我尝试了一个信号量,这是有效的,但我想知道是否有任何其他方法会更简单,更友好的读者。

编辑:

最后,我这样做了:我想我本可以做得更好,但这对我来说是有效的,看起来也足够公平。

代码语言:javascript
复制
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");
    }
}
}
EN

回答 1

Stack Overflow用户

发布于 2013-04-23 06:06:56

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

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

这是一个使用AFNetworking和GHUnit编写的基本测试。

代码语言:javascript
复制
- (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...
}

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16149523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档