如何在iOS Xcode中使用Alamofire实施单元测试

在开发iOS应用时,我们应该为这些方法编写单元测试。 编写单元测试可确保所需功能正常运行。

因此,让我们开始如何实现它。

在本次会议中,我将Alamofire用于网络请求,将SwiftyJson用于数据解析。 我已经使用CocoaPods安装了这些库。 您可以参考以下链接https://stackoverflow.com/questions/36084956/integarte-install-cocoapods-to-existing-xcode-project-objective-c-or-swift进行CocoaPods安装。

因此,使用Alamofire进行网络调用的代码将是,我已将此代码添加到名为HttpClient.swift的类中

  Alamofire.request(apiURL,方法:方法,参数:参数,编码:编码,标头:customHeader) 
  .responseJSON { 
  debugPrint(“ \ n \ napi响应>>> \(String(描述:response.result.value))\ n”) 
  切换 (response.result){ 
  案例 .success( _ ): 
  如果 数据= response.result.value { 
   json = JSON(数据) 
  completeHandler(json, nil
  自我 .handleSessionExpiredForResponse(json:json) 
  } 
  情况 .failure( _ ): 
  如果 response.result.error!=  { 
  debugPrint(“ \ n \ nresponse.result.error!>>> \(response.result.error!)\ n”) 
  completeHandler( nil ,response.result.error  NSError?) 
  } 
  } 
  } 

使用此代码,将完成主网络调用。

现在,在您的控制器类中,我们将开始网络调用。 在这里,我定义了API中必需的必需的API参数。

  func callLoginApiForLogin(completionHandler: @escaping_ status:Bool)-> Void){ 
   param = [ 
  KEY_EMAIL:“电子邮件值”, 
  KEY_PASSWORD:“密码值” 
  ] 作为 [String: Any ] 
  loginModal.callLoginAPI(params:param,cntr: self ){(isSuccess)  
  如果 isSuccess { 
  debugPrint(“ ---->登录数据\( self .loginModal.userDetail?.firstName ??”“)\(isSuccess)”) 
  completeHandler( true
  } 其他 { 
  completeHandler( false
  } 
  } 

在这里,我使用ViewModal体系结构进行网络调用。 我已将其命名为LoginModal类,并在Controller类中使该LoginModal类成为对象,并在加载视图时调用了Login api。

   ViewController:UIViewController { 
  //设置视图模型 
  var loginModal = LoginModal() 

  覆盖 func viewDidLoad(){ 
  超级 .viewDidLoad() 
  self .callLoginApiForLogin {(isFinished:Bool) in 
  如果 isFinished { 
  debugPrint(“完成!!”) 
  } 
  } 
  } 

现在,在名为LoginModal的ViewModal类中,我发出了网络请求。 在这里,HttpClient是我们在其中调用Alamofire方法的类名称,而UserDetail是在其中完成数据解析并将其存储在Modal Class中的类。

  导入 UIKit 
  导入 SwiftyJSON 
   LoginModal:NSObject { 
  var userDetail:UserDetail? 
  typealias FetchLoginCompletion =((( _ isSuccess:Bool)->无效) 
  func callLoginAPI(params:[String: Any ], cntr :UIViewController,complementHandler: @转义FetchLoginCompletion){ 
  cntr.view.endEditing( true
  let apiUrl =“ Api Url” 
  HttpClient.apiRequestCall(方法:.post,apiURL:apiUrl,参数:参数,标头:HEADER){(json:JSON ?, error:NSError?) 
  如果 json!= nil { 
  如果是 json![KEY_STATUS] .boolValue { 
   userDetail = UserDetail()。parseResponse(json:json![KEY_USER_DATA]) 
  自我 .userDetail = userDetail 
  completeHandler( true
  } 其他 { 
  completeHandler( false
  } 
  } 其他 { 
  如果错误!= nil { 
  completeHandler( false
  } 其他 { 
  completeHandler( false
  } 
  } 
  } 
  } 
  } 

因此,当我们从服务器获得响应时,可以按照以下方式完成数据解析:

  导入 UIKit 
  进口基金会 
  导入 SwiftyJSON 
  // API KEYS 
   KEY_FIRST_NAME =“名字” 
   KEY_USER_DATA =“ userData” 
   UserDetail:NSObject,NSCoding { 
  var firstName:String =“” 
  覆盖 init (){ 
  超级 .init() 
  } 
  func parseResponse(json:JSON)-> UserDetail { 
  firstName = json [KEY_FIRST_NAME] .stringValue 
  返回 自我 
  } 
  } 

我有多个数据,但是在这里我仅使用firstName值进行解析。 您可以根据要求解析所有数据。

现在,我们已经完成了网络调用部分,还解析了服务器数据。 现在,该为单元测试编写代码了。

因此,要编写UnitTest,我们可以在创建项目时通过检查添加的UnitTest文件来添加UnitTest,或者稍后通过在Xcode中使用AddNewFiles添加UnitTest。 请参考截图相同。

现在,首先在我们的UnitTest类中,将使我们的Controller类成为对象。 默认情况下,UnitTest类导入XCTest Framework

   ApiUnitTestDemoTests:XCTestCase { 
  var vc:ViewController = ViewController() 
}

之后,我们将添加自己的方法来编写UnitTest代码,请记住,UnitTest类中的方法应以’test’关键字开头。

我测试登录api成功的方法是

  func testLoginApiResponse(){ 
   e =期望(描述:“ Alamofire”) 
  vc.callLoginApiForLogin {(已完成:布尔)  
  如果 isFinished { 
  debugPrint(“在单元测试中完成!!”) 
  debugPrint(“ ---->单元测试登录数据\( self .vc.loginModal.userDetail?.firstName ??”“)”) 
   resultString = self .vc.loginModal.userDetail?.firstName ??  ” 
   ExpectString =“ qa” 
  XCTAssertEqual(resultString,ExpectedString) 
  } 
  e.fulfill() 
  } 
  waitForExpectations(超时:5.0,处理程序: nil
  } 

在此方法中,我定义了一个期望类型,然后调用了控制器类的登录函数。 当我们从api获取结果时,然后使用XCTAssertEqual来检查服务器响应和预期响应是否相同。 如果两者相同,则通过UnitTest。

在这里,我们必须定义一些等待时间,服务器需要哪个等待时间来获得响应。

另外,在调用方法内部,我们将需要定义应使用’e.fulfill()’方法满足的期望。

现在,您可以通过运行函数旁边的播放按钮来检查UnitTest方法是否正常工作。 如果Diamond变成绿色,则说明测试用例已成功执行,否则我们需要重新检查它。 请参阅ScreenShot:

因此,这就是我们在XCode项目中实现UnitTesting的方式。

请随时分享您对本教程的反馈。 随时欢迎任何反馈。 🙂