URLSession完成者的单元测试包装器

时间:2017-04-07 17:43:37

标签: swift testing signature urlsession

我已经使用符合URLSession完全回调签名的方法定义了我自己的类,例如: G。 (Data?, Response?, Error?) -> Void。 该方法包含处理响应的通用逻辑,例如。 G。检查数据,解析数据等 现在我想对这种方法进行单元测试。这些方法包含一些验证,例如

guard let data = data else {
    //some logic
    return
}

在这里,我想测试该功能是否真的会被终止。当然,不可能实现它以防止返回空虚(我想是的,也许我错过了一些东西)。 另一种选择 - 将方法标记为throws,然后测试特定错误。但是这个方法不适合URLSession.shared.dataTask方法。 我对这些事情有点偏执吗?有没有可能实现它? 提前致谢。

1 个答案:

答案 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响应。