测试已测试 | ✓ |
语言编程语言 | SwiftSwift |
许可证 | BSD |
发布最新发布 | 2016 年 1 月 |
SPM支持 SPM | ✗ |
由 Johannes Schriewer 维护。
依赖项 | |
Alamofire | ~> 3.0 |
DEjson | ~> 1.0 |
MockingBird 是一个相对简单且功能强大的 HTTP/HTTPS 响应模拟库,用 Swift 编写,用于在 OS X 和 iOS 应用程序的单元测试中。
MockingBird 可以拦截正在运行的 App 中所有对 HTTP 和 HTTPS URL 的调用,并返回预定义的答案。
答案包装在所谓的 Mock-Bundles(只是一个目录和一些文件)中,并且您可以在任何时候在不同 Mock-Bundles 之间切换。这可以用于模拟服务器上的状态。
MockingBird 主要是单个 Swift 文件(mockingbird.swift
),但需要一些 Mock-Bundles 来工作。
只需将 mockingbird.swift
放入您的项目中。
MockingBird 使您能够轻松地在 NSURLSession
对象中注册,只需调用
let session:NSURLSession = ...
MockingBird.registerInSession(session)
如果您使用 Alamofire,那么您在创建 Alamofire.Manager
时可能可以访问会话配置
let configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
MockingBird.registerInConfig(configuration)
要模拟响应,您必须定义哪些请求匹配到哪些答案,这在内 Mock-Bundles 中完成,该 Mock-Bundles 在磁盘上具有以下结构
bundle.json
bundle.json
引用的文件…bundle.json
Bundle JSON 是一个包含对象的 JSON Array,每个对象包含两个基础对象,request
和 response
method
: (可选) HTTP 方法,默认为 GET
url
: 要模拟的 URL,以 ://
开头(跳过 http)parameters
: (可选) JSON 对象,包含查询参数的键值项,默认为空,如果参数值为 null
,则仅检查参数是否存在,而不检查其值。code
:HTTP响应代码headers
:(可选)附加响应头,默认为空file
:(可选)要发送的数据的文件名,默认为“不发送额外的数据”mime_type
:(可选)响应体的MIME类型,默认为application/octet-stream
bundle.json
[
{
"request": {
"url": "://httpbin.org/ip"
},
"response" : {
"code": 200,
"file": "ip.json",
"mime_type": "application/json"
}
}
]
要将Mock-Bundle包含到单元测试中,将你的包创建在某个地方,并将其作为文件夹引用(而不是组)添加到你的Xcode项目中,并将文件的Target设置为你的单元测试(所以不要将模拟包包含到你的应用目标中)
然后,将以下代码添加到你的测试中(以Alamofire为例)
import anfema_mockingbird // needed only for install via cocoapods
import Alamofire
class mockingbirdTests: XCTestCase {
var alamofire: Alamofire.Manager! = nil
override func setUp() {
super.setUp()
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
MockingBird.registerInConfig(configuration)
self.alamofire = Alamofire.Manager(configuration: configuration)
let bundle = NSBundle(forClass: self.dynamicType).resourcePath! + "/bundles/httpbin"
do {
try MockingBird.setMockBundle(bundle)
} catch {
XCTFail("Could not reset mock bundle")
}
}
}
这里有趣的是如何获取Mock-Bundle路径
let bundle = NSBundle(forClass: self.dynamicType).resourcePath! + "/bundles/httpbin"
bundles/httpbin
是你要包含的包文件夹引用的名称。
现在,将通过self.alamofire发送的每个HTTP(S)请求都将检查Mocking-Bundle中的匹配项,如果存在匹配项,则返回预定义的答案,否则请求将像平时一样通过网络
如果你还没有转换到使用NSURLSession
,你可以将MockingBird注册在更低的级别上
NSURLProtocol.registerClass(MockingBird)
但是请注意,如果你使用的是带有此设置的NSURLSession
,它将不会适用于会话,这个只适用于不带NSURLSession
的老版本