MockDuck Mascot

MockDuck

MockDuck 是一个使用 Swift 编写的网络模拟层,适用于 iOS、tvOS 和 macOS。它具有以下主要功能:

  1. MockDuck 可以将所有网络流量记录到磁盘。此记录的数据可以在您运行应用程序时使用,并为您的 UI 和单元测试提供更稳定的基础设施。
  2. 只需几行代码,MockDuck 就可以劫持任何 URLRequest,并提供模拟的 URLResponse 及其关联数据。

请求模拟

MockDuck 提供对代码中模拟网络请求的基本支持。 这是为您的单元测试添加可靠性和稳定性的好方法。 例如:

MockDuck.registerRequestHandler { request in
    if request.url?.absoluteString == "https://api.buzzfeed.com/create_user" {
        return try? MockResponse(for: request, statusCode: 201)
    } else {
        return nil
    }
}

MockDuck 还支持指定 HTTP 响应标头,以及响应有效负载中的 JSON 或任何其他数据。 不要忘记在您的测试用例类的 tearDown 方法中调用 MockDuck.unregisterAllRequestHandlers()

录制 & 回放

要开始在 MockDuck 会话中捕获网络活动,只需告诉 MockDuck 应该在哪里记录请求及其响应:

MockDuck.recordingURL = URL(fileURLWithPath: "/tmp/MockDuckRecording")

然后,当您想停止录制时:

MockDuck.recordingURL = nil

您现在可以(或在将来启动您的应用程序时)告诉 MockDuck 使用此记录来回放任何匹配的请求:

MockDuck.loadingURL = URL(fileURLWithPath: "/tmp/MockDuckRecording")

在这种情况下,如果您的录制中未找到任何请求,MockDuck 将回退到网络。 如果您希望这些请求直接失败,则可以将 MockDuck.shouldFallbackToNetwork 设置为 false。 在这种情况下,任何发出无法由录制处理的网络请求的人都会收到一个 URLError 错误,其错误代码为 .notConnectedToInternet

MockDuck 的目标之一是使录制尽可能易于人类阅读和修改。 在有意义的情况下,整个请求和响应都作为单个 JSON 文件写入录制目录。 如果响应还包括图像、文本文件或 JSON 文件,则该数据将存储在请求/响应 JSON 旁边的单独文件中。 如果返回其他格式的数据,则该数据将经过 Base64 编码并作为 JSON 文件中的值写入。 可以随意修改任何这些文件以更改模拟的响应。

我们建议为使用您的应用程序的不同方式制作一些不同的录制。 例如,您可能想要为您的应用程序的正常流程创建一个录制,另一个捕获各种失败场景,另一个用于尚未登录的匿名用户。

规范化请求

通常,MockDuck 使用由请求的绝对 URL 和其 HTTP 正文的组合生成的哈希来确定请求和响应应存储到磁盘的位置。 但是,有时您的应用程序发出的请求包括不一致或随机的数据,例如 缓存清除器,并且您希望多个请求哈希到相同的值。 MockDuck 支持通过利用 MockDuckDelegate 来规范化请求。 例如,如果您不希望请求的 HTTP 正文影响请求存储到磁盘的位置:

class SampleMockDuckDelegate: MockDuckDelegate {
    func normalizedRequest(for request: URLRequest) -> URLRequest {
        var request = request
        request.httpBody = nil
        return request
    }
}

let sampleDelegate = SampleMockDuckDelegate()
MockDuck.delegate = sampleDelegate

安装

CocoaPods

CocoaPods 是 Swift 和 Objective-C Cocoa 项目的依赖项管理器。 要将 MockDuck 集成到您的项目中,请在您的 Podfile 中指定它:

pod 'MockDuck'

Carthage

Carthage 是一个简单、去中心化的 Cocoa 依赖项管理器。 要将 MockDuck 集成到您的项目中,请将以下内容添加到您的 Cartfile 中:

github "BuzzFeed/MockDuck" "main"

Swift 包管理器

Swift 包管理器是用于管理以 Swift 编写的源代码分发的工具。 要将 MockDuck 与您的 Swift 库或应用程序集成,请将其作为依赖项添加到您的 Package.swift 中:

    dependencies: [
        .package(url: "https://github.com/BuzzFeed/MockDuck", .branch("main"))
    ],
    targets: [
        .target(name: "your-target-name", dependencies: ["MockDuck"])
    ]

手动

也可以使用 git 子模块手动将 MockDuck 集成到您的项目中。 添加子模块后,只需将 MockDuck.xcodeproj 拖到您的 Xcode 项目或工作区中,然后让您的目标链接到 MockDuck.framework

行为准则

帮助我们保持 MockDuck 的开放性和包容性。 请阅读并遵守我们的 行为准则

版本控制

我们对 MockDuck 版本使用 语义化版本。 有关可用版本,请查看 此存储库上的标签

致谢

许可证

本项目基于 MIT 许可证 - 有关详细信息,请参阅 LICENSE 文件。