我正在iOS中开发一个对服务器进行HTTP调用的框架。我想编写单元测试来测试API。我想模拟服务器调用,而不是实际进行真正的服务器调用。任何人都可以帮助我进行示例单元测试进行模拟服务器调用。我们如何设置期望并返回手工构建的 url 响应。我使用 XCTest 框架进行单元测试,使用 OCMock 模拟对象。
问问题
3156 次
2 回答
2
使用 OHTTPStubs,https://github.com/AliSoftware/OHHTTPStubs。
这是一个模拟对特定 GET 请求的响应并返回 JSON 数据的实际示例。
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
return [request.URL.path isEqualToString:@"/api/widget"];
} withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) {
id JSON = @{ @"id": @"1234", @"name" : @"gadget" };
NSData *data = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:nil];
return [OHHTTPStubsResponse responseWithData:data statusCode:200 headers:@{ @"Content-Type": @"application/json" }];
}];
于 2014-01-16T23:15:03.600 回答
2
以下是模拟 sendAsynchronousRequest 的方法:
NSDictionary *serverResponse = @{ @"response" : [[NSHTTPURLResponse alloc] initWithURL:nil statusCode:200 HTTPVersion:nil headerFields:@{}],
@"data" : [@"SOMEDATA" dataUsingEncoding:NSUTF8StringEncoding]
};
id connectionMock = [OCMockObject mockForClass:NSURLConnection.class];
[[[connectionMock expect] andDo:^(NSInvocation *invocation) {
void (^handler)(NSURLResponse*, NSData*, NSError*);
handler = [invocation getArgumentAtIndexAsObject:4];
handler(serverResponse[@"response"], serverResponse[@"data"], serverResponse[@"error"]);
}] sendAsynchronousRequest:OCMOCK_ANY queue:OCMOCK_ANY completionHandler:OCMOCK_ANY];
编辑
为了增加说明,这就是正在发生的事情。在这个例子中,我们真正的代码调用了这个方法,传递了三个参数,[NSURLConnection sendAsynchronousRequest: queue: completionHandler:]
加上传递给所有Objective-C方法调用的附加参数。因此,当我们检查索引 4 处的参数时,就是我们的完成处理程序。由于我们正在模拟来自服务器的响应,因此我们希望使用代表我们正在测试的案例的假数据来调用此处理程序。_cmd
self
NSInvocation
方法调用的签名getArgumentAtIndexAsObject
在 OCMock 包含的头文件中,但默认情况下不包含在框架中。我相信它被称为NSInvocation+OCMAdditions.h
. 它通过返回一个id
.
于 2013-12-18T16:47:18.637 回答