gpt4 book ai didi

ios - 如何对 NSURLConnection 委托(delegate)进行单元测试?

转载 作者:技术小花猫 更新时间:2023-10-29 10:42:13 26 4
gpt4 key购买 nike

如何对我的 NSURLConnection 委托(delegate)进行单元测试?我制作了一个 ConnectionDelegate 类,它符合不同的协议(protocol),可以将数据从 Web 提供给不同的 ViewController。在我走得太远之前,我想开始编写我的单元测试。但我不知道如何在没有互联网连接的情况下将它们作为一个整体进行测试。我还想知道我应该如何处理异步回调。

最佳答案

这与 Jon 的回复类似,但无法将其放入评论中。第一步是确保您没有创建真正的连接。实现此目的的最简单方法是将连接的创建拉入工厂方法,然后在您的测试中替换该工厂方法。使用 OCMock 的部分模拟支持,这可能看起来像这样。

在你的真实类里面:

- (NSURLConnection *)newAsynchronousRequest:(NSURLRequest *)request
{
return [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

在你的测试中:

id objectUnderTest = /* create your object */
id partialMock = [OCMockObject partialMockForObject:objectUnderTest];
NSURLConnection *dummyUrlConnection = [[NSURLConnection alloc]
initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"file:foo"]]
delegate:nil startImmediately:NO];
[[[partialMock stub] andReturn:dummyUrlConnection] newAsynchronousRequest:[OCMArg any]];

现在,当您的被测对象尝试创建 URL 连接时,它实际上获得了在测试中创建的虚拟连接。虚拟连接不一定是有效的,因为我们没有启动它并且它永远不会被使用。如果您的代码确实使用了连接,您可以返回另一个模拟,一个模拟 NSURLConnection 的模拟。

第二步是在您的对象上调用触发创建 NSURLConnection 的方法:

[objectUnderTest doRequest];

因为被测对象没有使用真实连接,我们现在可以从测试中调用委托(delegate)方法。对于 NSURLResponse,我们使用另一个模拟,响应数据是从在测试中其他地方定义的字符串创建的:

int statusCode = 200;
id responseMock = [OCMockObject mockForClass:[NSHTTPURLResponse class]];
[[[responseMock stub] andReturnValue:OCMOCK_VALUE(statusCode)] statusCode];
[objectUnderTest connection:dummyUrlConnection didReceiveResponse:responseMock];

NSData *responseData = [RESPONSE_TEXT dataUsingEncoding:NSASCIIStringEncoding];
[objectUnderTest connection:dummyUrlConnection didReceiveData:responseData];

[objectUnderTest connectionDidFinishLoading:dummyUrlConnection];

就是这样。您已经有效地伪造了被测对象与连接的所有交互,现在您可以检查它是否处于应有的状态。

如果您想查看一些“真实”代码,请查看 CCMenu 项目中使用 NSURLConnections 的类的测试。这有点令人困惑,因为被测试的类也被命名为连接。

http://ccmenu.svn.sourceforge.net/viewvc/ccmenu/trunk/CCMenuTests/Classes/CCMConnectionTest.m?revision=129&view=markup

关于ios - 如何对 NSURLConnection 委托(delegate)进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9908547/

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