OHHTTPStubs

Platform Language: Swift-2.x/3.x/4.x/5.x Build Status

Version Carthage Supported Swift Package Manager Supported

OHHTTPStubs 是一个旨在非常容易地桩接(stub)你的网络请求的库。它可以帮助你

它与 NSURLConnectionNSURLSessionAFNetworkingAlamofire 或任何使用 Cocoa 的 URL 加载系统的网络框架一起工作。

Donate


文档 & 使用示例

OHHTTPStubs 的头文件使用类似 Appledoc / Headerdoc 的注释进行了完整的文档化。 你也可以 在此处阅读在线文档

基本示例

在 Objective-C 中
[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"}];
}];
在 Swift 中

此示例使用 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.swiftSwift 子规范或 OHTTPStubsSwift 包),你也可以像这样组合匹配器函数:stub(isScheme("http") && isHost("myhost")) { … }

更多示例 & 帮助主题

记录请求以便稍后重放

你可以使用像 SWHttpTrafficRecorder 这样的工具来记录网络请求到文件中,而不是手动编写你想要使用的桩的内容。 这样,你以后可以使用这些文件作为桩响应。
该工具可以记录 OHHTTPStubs 支持的所有三种格式(HTTPMessage 格式、简单的响应体/内容文件和 Mocktail 格式)。

(还有其他方法可以执行类似的任务,包括使用 curl -is <url> >foo.response 生成与 HTTPMessage 格式兼容的文件,或使用类似于 SWHttpTrafficRecorder 的其他网络记录库)。

兼容性

即使你不使用 OHHTTPStubsSwift.swift 提供的专用 Swift API 包装器,也已将 Nullability 注释 添加到 ObjC API,以便在使用 Swift 时允许更清晰的 API。

更新到 9.0+ 版本

在你的项目中安装

CocoaPods

建议使用 CocoaPods

pod 'OHHTTPStubs/Swift' # includes the Default subspec, with support for NSURLSession & JSON, and the Swiftier API wrappers

所有可用的子规范

OHHTTPStubs 被拆分为子规范,以便在使用 Cocoapods 时,你可以只获取你需要的,不多也不少。

所有子规范及其依赖项的列表

以下是你可以在 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'

Swift Package Manager

OHHTTPStubs 与 Swift Package Manager 兼容,并提供 2 个用于使用的目标:OHHTTPStubsOHHTTPStubsSwift

注意:我们目前不支持 Swift Package Manager 中的 HTTPMessage 或 Mocktail 子规范。 如果你对这些感兴趣,请打开一个 issue 来解释你的需求。

Carthage

OHHTTPStubs 也与 Carthage 兼容。 只需将其添加到你的 Cartfile 中即可。

注意:使用 Carthage 构建的 OHHTTPStubs.framework 将包含 OHHTTPStubs所有已开启的功能(换句话说,该 pod 的所有子规范),包括 NSURLSessionJSON 支持、OHPathHelpersHTTPMessageMocktail 支持以及 Swiftier API。

为你的项目使用正确的 Swift 版本

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:无需操作

如果你使用 CocoaPods 版本 1.1.0.beta.1 或更高版本,那么 CocoaPods 将使用与你用于你的项目的 Swift 版本相匹配的正确 Swift 版本自动编译 OHHTTPStubs。 你无需执行任何操作! 🎉

有关更多信息,请参见 CocoaPods/CocoaPods#5540CocoaPods/CocoaPods#5760

Carthage:选择正确的版本

该项目在 master 上设置为 SWIFT_VERSION=5.0

这意味着 master 上的框架将使用

如果你希望 Carthage 使用 Swift 3.x 构建框架,你可以

特别注意事项

在你的单元测试中使用 OHHTTPStubs

OHHTTPStubs 非常适合编写通常会执行网络请求的单元测试。 但是,如果你在你的单元测试中使用它,请不要忘记

自动加载

OHHTTPStubs 会自动加载和安装(在库加载到内存时),适用于

如果你需要禁用(并重新启用)OHHTTPStubs — 全局或每个 NSURLSession — 你可以使用 [HTTPStubs setEnabled:] / [HTTPStubs setEnabled:forSessionConfiguration:]

已知限制

据我所知,对于这三个限制,我们无能为力。 如果您知道任何可以解决问题的方法,请告诉我。

提交到 App Store

OHHTTPStubs 可以用于提交到 App Store 的应用程序。 它不使用任何私有 API,没有任何东西阻止您发布它。

但是您通常只在开发阶段使用 stubs,并希望在提交到 App Store 时删除您的 stubs。 因此,请注意仅在需要时才包含 OHHTTPStubs(仅在您的测试目标中,或仅在 #if DEBUG 部分内,或通过使用每个构建配置的 pods),以避免忘记在您为 App Store 发布时删除它,并且您希望您的请求访问真实的网路!

许可证和鸣谢

这个项目和库由 Olivier Halligon 创建(Twitter上的@aligatr),并基于 MIT 许可证。

它受到了这篇来自 InfiniteLoop.dk 的文章的启发。

我还要感谢

如果您想支持此库的开发,请随时Donate。 感谢迄今为止的所有贡献者!