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

时间:2013-02-10 11:26:40

标签: ios afnetworking kiwi

我正在使用iOS应用,它连接到第三方网络服务。我有大约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];

}

3 个答案:

答案 0 :(得分:5)

如果您在帮助程序类上设置了shouldEventually期望并使用receive:(SEL)withArguments:(id)...表单,那么您可以检查收到的参数是否是您期望的。

值得了解的两个问题是在拨打电话之前设定期望;并使用shouldEventually表单而不是should,以便测试延迟足够长的时间来进行调用。

答案 1 :(得分:4)

我强烈建议您查看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调用中发出网络请求时,都会返回此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和匹配框架Expecta。它们允许超级简单的异步单元测试,当与OHHTTPStubs结合使用时,可提供单元测试API调用所需的全部功能。

答案 2 :(得分:3)

我建议Nocilla

检查this other answer以查找类似问题以获取更多信息