OHHTTPStubs 是一个旨在非常容易地桩接(stub)你的网络请求的库。它可以帮助你
它与 NSURLConnection、NSURLSession、AFNetworking、Alamofire 或任何使用 Cocoa 的 URL 加载系统的网络框架一起工作。
OHHTTPStubs 的头文件使用类似 Appledoc / Headerdoc 的注释进行了完整的文档化。 你也可以 在此处阅读在线文档。
[HTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
return [request.URL.host isEqualToString:@"mywebservice.com"];
} withStubResponse:^HTTPStubsResponse*(NSURLRequest *request) {
// Stub it with our "wsresponse.json" stub file (which is in same bundle as self)
NSString* fixture = OHPathForFile(@"wsresponse.json", self.class);
return [HTTPStubsResponse responseWithFileAtPath:fixture
statusCode:200 headers:@{@"Content-Type":@"application/json"}];
}];
此示例使用 OHHTTPStubs/Swift 子规范或 OHHTTPStubs 包提供的 OHHTTPStubsSwift.swift 中的 Swift 辅助函数。
stub(condition: isHost("mywebservice.com")) { _ in
// Stub it with our "wsresponse.json" stub file (which is in same bundle as self)
let stubPath = OHPathForFile("wsresponse.json", type(of: self))
return fixture(filePath: stubPath!, headers: ["Content-Type":"application/json"])
}
注意:如果你正在使用 OHHTTPStubs 的更 Swift 化的 API (OHHTTPStubsSwift.swift 和 Swift 子规范或 OHTTPStubsSwift 包),你也可以像这样组合匹配器函数:stub(isScheme("http") && isHost("myhost")) { … }
OHHTTPStubs 的文章。你可以使用像 SWHttpTrafficRecorder 这样的工具来记录网络请求到文件中,而不是手动编写你想要使用的桩的内容。 这样,你以后可以使用这些文件作为桩响应。
该工具可以记录 OHHTTPStubs 支持的所有三种格式(HTTPMessage 格式、简单的响应体/内容文件和 Mocktail 格式)。
(还有其他方法可以执行类似的任务,包括使用 curl -is <url> >foo.response 生成与 HTTPMessage 格式兼容的文件,或使用类似于 SWHttpTrafficRecorder 的其他网络记录库)。
OHHTTPStubs 与 iOS5+、OS X 10.7+、tvOS 兼容。OHHTTPStubs 也适用于 NSURLSession 以及任何包装它们的网络库。OHHTTPStubs 与 Swift 3.x、4.x 和 Swift 5.x 完全兼容。即使你不使用 OHHTTPStubsSwift.swift 提供的专用 Swift API 包装器,也已将 Nullability 注释 添加到 ObjC API,以便在使用 Swift 时允许更清晰的 API。
OH 前缀 (OHHHTTPStubs -> HTTPStubs, OHHTTPStubsResponse -> HTTPStubsResponse, etc)。OHPathHelpers 类已重命名为 HTTPStubsPathHelpers。建议使用 CocoaPods。
OHHTTPStubs,请将 pod 'OHHTTPStubs' 添加到你的 Podfile 中。OHHTTPStubs,请将 pod 'OHHTTPStubs/Swift' 添加到你的 Podfile 中。pod 'OHHTTPStubs/Swift' # includes the Default subspec, with support for NSURLSession & JSON, and the Swiftier API wrappers
OHHTTPStubs 被拆分为子规范,以便在使用 Cocoapods 时,你可以只获取你需要的,不多也不少。
NSURLSession、JSON 和 OHPathHelpersSwift 子规范将 Swiftier API 添加到该默认子规范HTTPMessage 和 Mocktail 是可选的子规范:如果需要它们,请显式列出它们OHPathHelpers 不依赖于 Core,可以完全独立于 OHHTTPStubs 使用以下是你可以在 Podfile 中使用的每条不同行所包含的子规范的列表
| 子规范 | 核心 (Core) | NSURLSession | JSON | Swift | OHPathHelpers | HTTPMessage | Mocktail |
|---|---|---|---|---|---|---|---|
pod 'OHHTTPStubs' |
✅ | ✅ | ✅ | ✅ | |||
pod 'OHHTTPStubs/Default' |
✅ | ✅ | ✅ | ✅ | |||
pod 'OHHTTPStubs/Swift' |
✅ | ✅ | ✅ | ✅ | ✅ | ||
pod 'OHHTTPStubs/Core' |
✅ | ||||||
pod 'OHHTTPStubs/NSURLSession' |
✅ | ✅ | |||||
pod 'OHHTTPStubs/JSON' |
✅ | ✅ | |||||
pod 'OHHTTPStubs/OHPathHelpers' |
✅ | ||||||
pod 'OHHTTPStubs/HTTPMessage' |
✅ | ✅ | |||||
pod 'OHHTTPStubs/Mocktail' |
✅ | ✅ |
OHHTTPStubs 与 Swift Package Manager 兼容,并提供 2 个用于使用的目标:OHHTTPStubs 和 OHHTTPStubsSwift。
OHHTTPStubs 相当于 OHHTTPStubs 子规范。OHHTTPStubsSwift 相当于 OHHTTPStubs/Swift 子规范。注意:我们目前不支持 Swift Package Manager 中的 HTTPMessage 或 Mocktail 子规范。 如果你对这些感兴趣,请打开一个 issue 来解释你的需求。
OHHTTPStubs 也与 Carthage 兼容。 只需将其添加到你的 Cartfile 中即可。
注意:使用 Carthage 构建的 OHHTTPStubs.framework 将包含 OHHTTPStubs 的所有已开启的功能(换句话说,该 pod 的所有子规范),包括 NSURLSession 和 JSON 支持、OHPathHelpers、HTTPMessage 和 Mocktail 支持以及 Swiftier API。
OHHTTPStubs 支持 Swift 3.0 (Xcode 8+)、Swift 3.1 (Xcode 8.3+)、Swift 3.2 (Xcode 9.0+)、Swift 4.0 (Xcode 9.0+)、Swift 4.1 (Xcode 9.3+)、Swift 4.2 (Xcode 10+)、Swift 5.0 (Xcode 10.2) 和 Swift 5.1 (Xcode 11),但我们仅在 CI 中测试 Swift 4.x(使用 Xcode 9.1 和 10.1)和 Swift 5.x(使用 Xcode 10.2 和 11)。
以下是一些关于根据你将 OHHTTPStubs 集成到你的项目中的方式,你需要进行正确设置的详细信息。
如果你使用 CocoaPods 版本 1.1.0.beta.1 或更高版本,那么 CocoaPods 将使用与你用于你的项目的 Swift 版本相匹配的正确 Swift 版本自动编译 OHHTTPStubs。 你无需执行任何操作! 🎉
有关更多信息,请参见 CocoaPods/CocoaPods#5540 和 CocoaPods/CocoaPods#5760。
该项目在 master 上设置为 SWIFT_VERSION=5.0。
这意味着 master 上的框架将使用
如果你希望 Carthage 使用 Swift 3.x 构建框架,你可以
OHHTTPStubs 的先前版本 (6.2.0) — 它的 master 分支使用 3.0SWIFT_VERSION 构建设置更改为 3.0XCODE_XCCONFIG_FILE=<config file declaring SWIFT_VERSION> carthage build 将 SWIFT_VERSION 传递给 carthage 来构建框架OHHTTPStubs 非常适合编写通常会执行网络请求的单元测试。 但是,如果你在你的单元测试中使用它,请不要忘记
tearDown 方法中调用 [HTTPStubs removeAllStubs]。 请参阅此 wiki 页面以获取更多信息OHHTTPStubs 会自动加载和安装(在库加载到内存时),适用于
NSURLConnection 或 [NSURLSession sharedSession] 发出的请求 — 感谢此代码[NSURLSession sessionWithConfiguration:…] 创建的,并使用 [NSURLSessionConfiguration defaultSessionConfiguration] 或 [NSURLSessionConfiguration ephemeralSessionConfiguration] 配置的 NSURLSession 发出的请求 — 感谢 方法交换 在 此处的代码中完成。如果你需要禁用(并重新启用)OHHTTPStubs — 全局或每个 NSURLSession — 你可以使用 [HTTPStubs setEnabled:] / [HTTPStubs setEnabled:forSessionConfiguration:]。
OHHTTPStubs 无法在后台会话中使用(使用 [NSURLSessionConfiguration backgroundSessionConfiguration] 创建的会话),因为后台会话不允许使用自定义 NSURLProtocols,并且由 iOS 操作系统本身处理。OHHTTPStubs 不模拟数据上传。 NSURLProtocolClient @protocol 没有提供一种方法来通知委托数据已发送(仅通知已加载某些数据),因此 NSURLRequest 的 HTTPBody 或 HTTPBodyStream 中的任何数据,或提供给 -[NSURLSession uploadTaskWithRequest:fromData:]; 的数据将被忽略,更重要的是,当你使用 OHHTTPStubs 桩接请求时,永远不会调用 -URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend: 委托方法。OHTTPStubs 存在一个已知的重定向问题,我们认为这是一个 Apple 的 bug。 此问题已经在这里和这里进行了讨论。 该 bug 的实际结果是,零秒延迟的重定向可能会不确定性地导致空响应。据我所知,对于这三个限制,我们无能为力。 如果您知道任何可以解决问题的方法,请告诉我。
OHHTTPStubs 可以用于提交到 App Store 的应用程序。 它不使用任何私有 API,没有任何东西阻止您发布它。
但是您通常只在开发阶段使用 stubs,并希望在提交到 App Store 时删除您的 stubs。 因此,请注意仅在需要时才包含 OHHTTPStubs(仅在您的测试目标中,或仅在 #if DEBUG 部分内,或通过使用每个构建配置的 pods),以避免忘记在您为 App Store 发布时删除它,并且您希望您的请求访问真实的网路!
这个项目和库由 Olivier Halligon 创建(Twitter上的@aligatr),并基于 MIT 许可证。
它受到了这篇来自 InfiniteLoop.dk 的文章的启发。
我还要感谢
NSInputStream