MockDuck 是一个使用 Swift 编写的网络模拟层,适用于 iOS、tvOS 和 macOS。它具有以下主要功能:
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 是 Swift 和 Objective-C Cocoa 项目的依赖项管理器。 要将 MockDuck 集成到您的项目中,请在您的 Podfile
中指定它:
pod 'MockDuck'
Carthage 是一个简单、去中心化的 Cocoa 依赖项管理器。 要将 MockDuck 集成到您的项目中,请将以下内容添加到您的 Cartfile
中:
github "BuzzFeed/MockDuck" "main"
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 文件。