如何在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的方式。
请随时分享您对本教程的反馈。 随时欢迎任何反馈。 🙂