如何使用AFNetworking对api调用进行单元测试



我有一个正在开发的iOS应用程序,它连接到第三方web服务。我有大约50个不同的调用,想用Kiwi编写单元测试,但我不知道从哪里开始。

由于我不负责API,我只需要使用正确的GET或POST方法检查我的调用是否指向正确的URL。

有什么方法可以正确测试吗?

以下是我的一个电话示例:

+ (void)listsForUser:(NSString *)username
            response:(void (^)(NSArray *lists))completion
{
    NSString *path = [NSString stringWithFormat:@"user/list.json/%@/%@", TRAKT_API_KEY, username];
    [TNTraktAPIManager requestWithMethod:GET
                                    path:path
                              parameters:nil
                                callback:^(id response) {
                                    completion(response);
                                }];
}

它调用以下辅助方法

+ (void)requestWithMethod:(HTTPMethod)method
                     path:(NSString *)path
               parameters:(NSDictionary *)params
                 callback:(void (^)(id response))completion
{
    NSString *methodString = @"POST";
    if (method == GET) {
        methodString = @"GET";
    }

    // Setup request
    NSURLRequest *request = [[TraktAPIClient sharedClient] requestWithMethod:methodString
                                                                        path:path
                                                                  parameters:params];
    // Setup operation
    AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                    success:^(NSURLRequest *request,
                                                              NSHTTPURLResponse *response,
                                                              id JSON) {
                                                        id jsonResults = JSON;
                                                        completion(jsonResults);
                                                    } failure:^(NSURLRequest *request,
                                                                NSHTTPURLResponse *response,
                                                                NSError *error,
                                                                id JSON) {
                                                        id jsonResults = JSON;
                                                        completion(jsonResults);
                                                        NSLog(@"%s: error: %@", __PRETTY_FUNCTION__, error);
                                                    }];
    // TODO: Queue operations
    [operation start];
}

如果在helper类上设置shouldEventually期望值并使用receive:(SEL)withArguments:(id)...形式,则可以检查收到的参数是否符合预期。

两个值得了解的问题是在打电话之前设置期望值;并且使用CCD_ 3形式而不是CCD_。

我强烈建议您查看OHHTTPStubs,以便对API类进行单元测试。

单元测试应该是确定性的,在混合中添加可能不可预测的互联网API会使测试条件变得不确定。

OHTTPStubs将允许您截断对传出HTTP请求的响应。基本上,它会拦截您的HTTP流量,如果请求符合您设置的标准,它会给出一个在JSON中声明的罐装响应(而不是API的不可预测结果)。这允许您在测试类中配置不同的响应场景:即404错误、部分响应数据等。

这里有一个例子:

我创建了这个JSON Stub并保存为JSON文件:

{
    "devices" :     [
                   {
                     "alarm" :            {
                     "alarm_id" : 1,
                   "attack_time" : "<null>",
                   "defined_time" : "2014-04-14T04:21:36.000Z",
                   "device_id" : 7,
                   "is_protected" : 0
                   },
                   "device_type" : "iPhone",
                   "id" : 7,
                   "os_version" : "7.1"
                   }
                   ],
    "email" : "mystubemail@gmail.com",
    "facebook_id" : 5551212,
    "id" : 3,
    "name" : "Daffy Duck"
}

每当在API调用中发出I网络请求时,都会返回此JSON,因为此OHHTTPStub在测试类中声明为在所有测试之前运行。

[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
            BOOL stringFound;
            if ([[request.URL description] rangeOfString:[NSString stringWithFormat:@"%@devices/register?", BASEURL]].location != NSNotFound)
            {
                stringFound = YES;
            }
            NSLog(@"%d", stringFound);
            return stringFound;
        } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
            // Stub it with our "RegisterDevice.json" stub file
            return [[OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"RegisterDevice.json",bundle)
                                                     statusCode:200 headers:@{@"Content-Type":@"text/json"}] requestTime:1.0 responseTime:1.0];
        }];

我不确定Kiwi是否允许异步测试,但如果不允许,我也建议研究Specta和匹配的框架Expect。它们允许非常简单的异步单元测试,当与OHHTTPStubs结合时,它提供了单元测试API调用所需的所有功能。

最新更新