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

Write unit test in swift package manager for API call

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

  1. URL

  2. HTTPMethod

  3. 参数

并且我在那边使用 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 class 中为这个方法编写单元测试用例。

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),
    ]
}

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

提前致谢。

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

关于您上面的代码片段,我必须提及一些事情,因为您直接在 API 核心 class 中调用 AlamofireAF.request) 您将无法模拟您的网络,因此无法执行单元测试本身。当然,您可以:

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

您应该查看这些资源:

我需要改进我的库中的文档,但网络层完全包含在测试中 + 它是 SPM(毕竟那是你最初的问题)。

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

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