MultipartFormDataParser

Actions Status Version Platform GitHub release Swift Package Manager GitHub license

MultipartFormDataParser 是一个用于在 Swift 中测试 multipart/form-data 请求的工具。

当通过 API 上传一些文件时,我们必须使用 multipart/form-data 进行请求。 multipart/form-data 的定义请参考 RFC-2388

大多数流行的网络库(例如 Alamofire, APIKit)都可以轻松实现。但是,要测试创建的请求是否符合预期是困难且麻烦的。

这个库提供了一个 multipart/form-data 请求的解析器,可以简单地对其进行测试。

let request: URLRequest = ...
do {
    let data = try MultipartFormData.parse(from: request)
    let genbaNeko = try XCTUnwrap(data.element(forName: "genbaNeko"))
    let message = try XCTUnwrap(data.element(forName: "message"))
    XCTAssertNotNil(Image(data: genbaNeko.data))
    XCTAssertEqual(genbaNeko.mimeType, "image/jpeg")
    XCTAssertEqual(message.string, "Hello world!")
} catch {
    XCTFail(error.localizedDescription)
}

使用 OHHTTPStubs,我们可以轻松地测试由网络库创建的请求。

let expectedGenbaNeko: Data = ...

let condition = isHost("localhost") && isPath("/upload")
stub(condition: condition) { request in
    let errorResponse = { (message: String) -> HTTPStubsResponse in
        .init(
            jsonObject: ["status": 403, "error": message],
            statusCode: 403, 
            headers: ["Content-Type": "application/json"]
        )
    }
    do {
        let data = try MultipartFormData.parse(from: request)
        guard let genbaNeko = data.element(forName: "genbaNeko"),
              genbaNeko.data == expectedGenbaNeko else { return errorResponse("Unexpected genbaNeko") }
        guard let message = data.element(forName: "message"),
              message.string == "Hello world!" else { return errorResponse("Unexpected message: \(message)") }
    } catch {
        return .init(error: error)
    }
    return .init(
        jsonObject: ["status": 200],
        statusCode: 200,
        headers: ["Content-Type": "application/json"]
    )
}

安装

Swift Package Manager (推荐)

Package.swift

dependencies: [
    .package(url: "https://github.com/417-72KI/MultipartFormDataParser.git", from: "2.3.1")
]

CocoaPods

Podfile

pod 'MultipartFormDataParser'