gpt4 book ai didi

ios - 测试 NSURLConnection 模拟对象与实现

转载 作者:行者123 更新时间:2023-11-29 02:55:05 25 4
gpt4 key购买 nike

我正在开发一个自定义网络库并为其编写一些单元测试用例。我不知道该怎么做。

我有一个 RequestObject,它是 NSOperation 的一个子类

@interface RequestOperation : NSOperation@property (nonatomic, strong) NSURLRequest *URLRequest;@property (nonatomic, strong, readonly) NSURLResponse *URLResponse;@property (nonatomic, strong, readonly) NSError *connectionError;@property (nonatomic, strong, readonly) NSData *responseData;-(id)initWithURLRequest:(NSURLRequest*)request;@end

在实现中,我有一个具有 NSURLConnection 的私有(private)类别。

我想写一个测试用例来检查发送请求后URLResponse是否存在

-(void)testIfResponseExist{    NSURL *url = [[NSURL alloc] initWithString:@"https://google.com"];    NSURLRequest  *request = [[NSURLRequest alloc] initWithURL:url];    myRequest = [[RequestOperation alloc] initWithURLRequest:request];    [myRequest start];    [self WaitFor:1];    XCTAssertNotNil(myRequest.URLResponse, @"Response should not be nil");}

这种单元测试方式是否正确?

现在这是向服务器发送实际请求。但是,我也可以 stub NSURLConnection 并发送虚拟响应。但我不确定我应该走哪条路。模拟对象的优点和缺点是什么?

最佳答案

您的测试对于测试库来说似乎是正确的,但我相信 Mocking 对象更适合应用程序测试。您不想为您的库测试转换做模拟,而是想在您的应用程序中测试使用您的库的用例。

我将通过一个示例来说明模拟对象与单元测试的威力。

我刚刚帮助编写了一个下载量很大的 iOS 应用程序的自动化框架。我们使用 OCMockKiF 来实际自动化应用内容更新。在我们的自动化测试中,我们使用与应用相同的完全代码来进行内容更新。但是,我们 OCMock 返回内容 URL 的方法并让它返回一个不同的 URL。这与 swizzling 非常相似。现在,该应用程序将指向我们的测试 URL,以便在测试时下载内容更新。使用 1-2 行代码,我们无需编写任何自定义代码即可换出 URL。

id mock = [OCMockObject mockForClass:[MasterUpdater class]];
[[[mock stub] andReturn:[NSString stringWithFormat:@"URL",BASE_UPDATE_TEST_URL]] getMasterUpdateURL];

有了这个,MasterUpdater:getMasterUpdateURL 返回了一个自定义 URL。这就是我们在单元测试中为我们切换自动化测试的 URL 所要做的全部工作!

如果我们不使用模拟,那么我们会在生产代码中编写额外的代码/方法来处理我们的自动化测试。

关于ios - 测试 NSURLConnection 模拟对象与实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23999740/

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