swift - URLSession 完成器的单元测试包装器

标签 swift testing signature urlsession

我已经使用适合 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/

相关文章:

swift - 根据图像高度获取 Collection View 自定义布局中单元格的高度

ios - 如何访问 UITableView 中每一行的相册

iphone - 应用商店中的 A/B 测试 View ?

testing - 如果我没有可用的服务,如何使用提交来测试 XForms?

c# - 使用正则表达式解析签名,具有 "fun"和数组返回值

swift - 从 FireBase SWIFT 检索数据

swift - 使用包含验证多个条件(其中 :)

django - 无法在 Django 测试类中加载对象

key - rpm 安装错误 : Header V4 RSA/SHA1 signature: BAD, key ID

javascript - 有什么方法可以复制 div 的呈现 HTML?