MockDuck 1.0

MockDuck 1.0

Sebastian CelisPete Walters 维护。



  • BuzzFeed

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。在这种情况下,任何无法由记录处理的网络请求都会收到一个带有.notConnectedToInternet代码的URLError错误。

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" "master"

Swift 包管理器

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

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

请注意,在 macOS 上 MockDuck 需要 10.12 或更高版本,因此您需要在 swift buildswift runswift test 命令中指定 -Xswiftc "x86_64-apple-macosx10.12" 作为参数。

手动方式

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

行为准则

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

版本控制

MockDuck 发行版使用 语义版本控制。可用的版本,请查看此存储库的标签

致谢

  • 我们可爱的吉祥物是由Celine Chang精心制作的。
  • VCR是一个受到MockDuck极大启发的工具,擅长记录和回放网络请求。虽然VCR是用Ruby编写的,但有一些iOS和macOS工具受到VCR的启发,包括VCRURLConnectionDVR
  • OHHTTPStubs是一个非常棒的工具,提供了简单的API在单元测试中模拟网络请求。这为MockDuck上述的请求模拟功能提供了灵感。

许可证

本项目采用MIT许可证 - 详见LICENSE文件以获取详细信息。