我已经使用适合 URLSession 完整回调签名的方法定义了自己的类,例如。 G。 (数据?、响应?、错误?)-> 无效
。
该方法包含用于处理响应的通用逻辑,例如。 G。检查数据,解析数据等
现在我想对这个方法进行单元测试。该方法包含一些验证,例如,
guard let data = data else {
//some logic
return
}
这里我想测试一下这个函数是否真的会被终止。当然不可能实现反对void return(我是这么认为的,也许我漏掉了什么)。
另一种选择 - 将方法标记为 throws
,然后测试特定错误。但是这个方法将不适合 URLSession.shared.dataTask
方法。
我对这些事情偏执吗?有没有可能实现它?
提前致谢。
最佳答案
通常我会尝试将查询逻辑分成几个部分:
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 秒内收到响应。
如何测试映射:
For mapping, I use 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()
}
}
然后,在这个类中创建你的模拟:
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 响应。
关于swift - URLSession 完成器的单元测试包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43284176/