我已经使用符合URLSession完全回调签名的方法定义了我自己的类,例如: G。 (Data?, Response?, Error?) -> Void
。
该方法包含处理响应的通用逻辑,例如。 G。检查数据,解析数据等
现在我想对这种方法进行单元测试。这些方法包含一些验证,例如
guard let data = data else {
//some logic
return
}
在这里,我想测试该功能是否真的会被终止。当然,不可能实现它以防止返回空虚(我想是的,也许我错过了一些东西)。
另一种选择 - 将方法标记为throws
,然后测试特定错误。但是这个方法不适合URLSession.shared.dataTask
方法。
我对这些事情有点偏执吗?有没有可能实现它?
提前致谢。
答案 0 :(得分:0)
通常我会尝试将查询逻辑分成几个部分:
1)路由器2)API客户端,它使用路由器3)映射模型
所有这些部分都可以测试。
如何测试API客户端:
fileprivate func testPerformanceOfGetNewsFromAPI() {
let expectationTimeout: Double = 30.0
self.measure {
let expectation = self.expectation(description: "Get gifters")
NewsAPIClient.getNews(closure: { response in
expectation.fulfill()
})
self.waitForExpectations(timeout: expectationTimeout) { error in
XCTAssertNil(error)
}
}
}
此测试将检查。 APIClient可以在30秒内收到回复。
如何测试映射:
对于映射,我使用JASON:https://github.com/delba/JASON
设置swift文件:
import XCTest
import JASON
@testable import ProjectName
final class NewsTests: XCTestCase {
// MARK: - Properties
fileprivate var news: News!
// MARK: - Lyfecycles
override func setUp() {
super.setUp()
news = mockExample()
}
override func tearDown() {
news = nil
super.tearDown()
}
}
然后,在这个类中创建你的mock:
fileprivate func mockExample() -> ExampleModel? {
let data: Data
let json: JSON
do {
try data = Data(resource: "MyExampleFile.json") // Here enter your JSON example file. Target member ship for this file should be your test target
try json = JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) as! JSON
} catch let error {
XCTFail(error.localizedDescription)
return nil
}
let model = ExampleModel(json: json)
return model
}
然后,您可以在此课程中编写测试:
fileprivate func testMapping() {
XCTAssertNotNil(news)
XCTAssertEqual(news.title, mockExample()?.title)
XCTAssertEqual(news.text, mockExample()?.text)
XCTAssertEqual(news.timeStamp, mockExample()?.timeStamp)
}
在测试逻辑中,您还可以添加图像上传(如果它们存在于JSON中)。因此,您可以检查当前模型是否正确,可以处理JSON响应。