MockDuck
MockDuck 是一个用 Swift 编写的网络模拟层,适用于 iOS、tvOS 和 macOS。它有以下主要特性
- MockDuck 可以将所有网络流量记录到磁盘上。您可以在此期间运行应用程序时使用这些记录的数据,同时也为您的 UI 和单元测试提供更稳定的架构。
- 使用几行代码,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 build
,swift run
和 swift 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的启发,包括VCRURLConnection和DVR。
- OHHTTPStubs是一个非常棒的工具,提供了简单的API在单元测试中模拟网络请求。这为MockDuck上述的请求模拟功能提供了灵感。
许可证
本项目采用MIT许可证 - 详见LICENSE文件以获取详细信息。