在 swift 包管理器中为 API 调用编写单元测试

Posted

技术标签:

【中文标题】在 swift 包管理器中为 API 调用编写单元测试【英文标题】:Write unit test in swift package manager for API call 【发布时间】:2020-06-01 09:30:01 【问题描述】:

我对编写单元测试用例完全陌生。 这是我第一次写,我很困惑。 我正在创建一个 swift 包管理器,我在其中编写了一种可以接受的方法

    网址

    HTTP方法

    参数

我在那里使用 Alamofire 作为包依赖,它将从传递的 URL 调用 API,然后响应将被捕获。

以下是代码, Framework.swift文件

public let APIFramework = APICore.default
let version = "1.0.0"

FrameworkClass.swift文件代码

import Foundation
import Alamofire

public protocol APICoreDelegate: AnyObject 
    func didReceiveData(data: Data)


open class APICore 
    public static let `default` = APICore()
    public var delegate: APICoreDelegate?
    open func processApiCall( url : String, method: HTTPMethod, parameters: Dictionary<String, Any>)
    
        AF.request(url, method: method, parameters: parameters).responseJSON  (response) in
        switch response.result 
            case .success:
                guard let jsonData = response.value else 
                    return
                
                self.delegate?.didReceiveData(data: jsonData as! Data)
            case .failure: break
            
        
    

现在我必须在CDHFrameworkTests 类中为此方法编写单元测试用例。

import XCTest
@testable import CDHFramework

final class CDHFrameworkTests: XCTestCase 
    override func setUp() 

    
    func testExample() 
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct
        // results.
    

    static var allTests = [
        ("testExample", testExample),
    ]

任何人都可以帮助我至少完成一个测试用例,这样我就可以研究它并尝试编写其余的测试用例。 我读了很多,但所有的材料都让我很困惑。 对此编写测试用例的任何帮助将不胜感激。

提前致谢。

【问题讨论】:

谷歌搜索“swift unit test network call”怎么样? 旁白:将潜在的不想要的依赖项强加给包的消费者被认为是不好的做法。除非您有真正令人信服的理由使用 Alamofire 而不是 URLSession,否则您应该考虑摆脱这种包袱。 【参考方案1】:

你开始了解单元测试真是太好了(相信我,它们会让你的生活变得更轻松)。

关于上面代码的 sn-p,我必须提到几件事,因为你在 API 核心类 (AF.request) 中直接调用 Alamofire,你将无法模拟您的网络,因此无法执行单元测试本身。当然,您可以:

使用 HTTP 代理与您的项目进行交互,从而使您的测试可靠,但这会引入大量样板和设置。 直接与测试/模拟端点交互,但这也需要注意,因为您将依赖网络连接并且需要引入大量等待时间才能将您的测试与响应时间。 不推荐

您应该查看这些资源:

Unit testing your network layer My own network library in SPM

我需要改进我的库中的文档,但网络层已被测试完全覆盖 + 它是 SPM(毕竟这是你最初的问题)。

祝大家在自动化测试方面一切顺利,干杯!

PS:您应该考虑消除简单任务的网络层依赖关系。如果您需要在网络端进行一些真正繁重的工作,Alamofire 和 Moya 等库是很好的选择,否则它们是不必要的样板。如果您需要一个起点,请查看这些其他重要资源:

Networking In Swift With URLSession:很好的介绍,让你的脚趾浸入 Swift 的原生 URLSession 水域 Network Requests and REST APIs in ios with Swift (Protocol-Oriented Approach):如果您已经熟悉协议和泛型,可以了解更多高级内容。

【讨论】:

以上是关于在 swift 包管理器中为 API 调用编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 包管理器中添加 Apollo 的代码生成构建脚本时出错

swift包管理器中的“警告:没有要在包中构建的目标”错误

从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift

如何在 Spring Boot REST API 中为 db insert 方法编写模拟单元测试?

在 Swift 中为特定方法调用实现闭包

如何在 Flutter 中为 Web 编写特定于平台的代码?