gpt4 book ai didi

ios - 在 iOS 单元测试中模拟 NSHTTPURLRequest 和 NSHTTPURLResponse

转载 作者:可可西里 更新时间:2023-11-01 05:41:14 25 4
gpt4 key购买 nike

我正在 iOS 中开发一个对服务器进行 HTTP 调用的框架。我想编写单元测试来测试 API。我想模拟服务器调用,而不实际进行真正的服务器调用。任何人都可以帮助我提供示例进行模拟服务器调用的单元测试。我们如何设置期望并返回手动构建的 url 响应。我正在使用 XCTest 框架进行单元测试,使用 OCMock 进行模拟对象。

最佳答案

下面是您可以模拟 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:] 传递给这个方法的三个参数,加上额外的 _cmdself 传递给所有 Objective-C 方法调用。因此,当我们检查 NSInvocation 时,索引 4 处的参数是我们的完成处理程序。由于我们正在模拟来自服务器的响应,因此我们希望使用代表我们正在测试的情况的假数据来调用此处理程序。

getArgumentAtIndexAsObject 方法调用的签名位于 OCMock 附带的头文件中,但默认情况下不包含在框架中。我相信它叫做 NSInvocation+OCMAadditions.h。它通过返回 id 使获取调用参数变得更容易。

关于ios - 在 iOS 单元测试中模拟 NSHTTPURLRequest 和 NSHTTPURLResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20650845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com