Swift中的HTTP模拟测试示例详解.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Swift中的HTTP模拟测试示例详解

目录正文StarWarsAPI类MockLoader

正文

我们已经了解了单个方法如何为通过网络加载请求提供基础。

然而,网络也是开发应用程序时最大的失败点之一,尤其是在单元测试方面。当我们编写单元测试时,我们希望测试是可重复的:无论我们执行多少次,我们应该总是得到相同的结果。

如果我们的测试涉及实时网络连接,我们无法保证这一点。由于我们实际网络请求失败的所有原因,我们的单元测试也可能失败。

因此,我们使用模拟对象来模拟网络连接,但实际上提供了一个一致且可重复的外观,我们可以通过它提供虚假数据。

由于我们已将网络接口抽象为单个方法,因此模拟它非常简单。

这是一个始终返回200OK响应的HTTPLoading实现:

publicclassMockLoader:HTTPLoading{

publicfuncload(request:HTTPRequest,completion:@escaping(HTTPResult)-Void){

leturlResponse=HTTPURLResponse(url:request.url!,statusCode:HTTPStatus(rawValue:200),httpVersion:1.1,headerFields:nil)!

letresponse=HTTPResponse(request:request,response:urlResponse,body:nil)

completion(.success(response))

我们可以在任何需要HTTPLoading值的地方提供MockLoader的实例,发送给它的任何请求都将导致200OK响应,尽管主体为nil。

当我们使用模拟网络连接编写单元测试时,我们并不是在测试网络代码本身。通过模拟网络层,我们将网络作为变量移除,这意味着网络不是被测试的对象:单元测试检查实验的变量。

StarWarsAPI类

我们将使用我们在上一篇文章中删除的StarWarsAPI类来说明这一原则:

publicclassStarWarsAPI{

privateletloader:HTTPLoading

publicinit(loader:HTTPLoading=URLSession.shared){

self.loader=loader

publicfuncrequestPeople(completion:@escaping(...)-Void){

varr=HTTPRequest()

r.host=swapi.dev

r.path=/api/people

loader.load(request:r){resultin

//TODO:interprettheresult

completion(...)

该类的测试将验证其行为:我们要确保它在不同情况下的行为正确。例如,我们要确保requestPeople()方法在收到200OK响应或404NotFound响应或500InternalServerError时行为正确。我们使用MockLoader模拟这些场景。这些测试将使我们有信心在不破坏现有功能的情况下改进StarWarsAPI的实现。

MockLoader

为了满足这些需求,我们的MockLoader需要:

保证传入的请求是我们在测试中期望的请求为每个请求提供自定义响应我个人版本的MockLoader大致如下所示:

publicclassMockLoader:HTTPLoading{

//typealiaseshelpmakemethodsignaturessimpler

publictypealiasHTTPHandler=(HTTPResult)-Void

publictypealiasMockHandler=(HTTPRequest,HTTPHandler)-Void

privatevarnextHandlers=ArrayMockHandler()

publicoverridefuncload(request:HTTPRequest,completion:@escapingHTTPH

文档评论(0)

183****9196 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档