【问题标题】:Testing NSURLConnection Mock object vs implementation测试 NSURLConnection 模拟对象与实现
【发布时间】:2014-07-22 21:04:42
【问题描述】:

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

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

@interface 请求操作: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*) 请求; @结尾

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

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

-(void)testIfResponseExist { NSURL *url = [[NSURL alloc] initWithString:@"https://google.com"]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; myRequest = [[RequestOperation alloc] initWithURLRequest:request]; [myRequest 开始]; [自我等待:1]; XCTAssertNotNil(myRequest.URLResponse, @"Response 不应该是 nil"); }

这种单元测试方式正确吗?

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

【问题讨论】:

    标签: ios unit-testing ocmock xctest


    【解决方案1】:

    您的测试似乎对测试库是正确的,但我相信 Mocking 对象更适合应用程序测试。您不想为您的库测试强制执行模拟,而是希望在您的应用中使用您的库的测试用例。

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

    我刚刚帮助编写了一个下载量很大的 iOS 应用程序的自动化框架。我们使用OCMockKiF 来实际自动化应用程序内容更新。在我们的自动化测试中,我们使用与应用程序相同的 exact 代码来进行内容更新。但是,我们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 所要做的全部工作!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2011-03-15
      相关资源
      最近更新 更多