4

我有一个正在开发的 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];

}
4

2 回答 2

5

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

两个值得了解的陷阱是在打电话之前设定期望;并使用shouldEventually表格而不是should使测试延迟足够长的时间以进行呼叫。

于 2013-02-19T23:25:04.893 回答
4

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

单元测试应该是确定性的,并且将 Internet 一个潜在不可预测的 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 调用所需的一切。

于 2014-04-18T23:39:42.233 回答