我正在使用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];
}
答案 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以查找类似问题以获取更多信息