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
和 OHPathHelpers
Swift
子规范将 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.0
SWIFT_VERSION
构建设置更改为 3.0
XCODE_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