anfema-mockingbird 1.0.1

anfema-mockingbird 1.0.1

测试已测试
语言编程语言 SwiftSwift
许可证 BSD
发布最新发布2016 年 1 月
SPM支持 SPM

Johannes Schriewer 维护。



 
依赖项
Alamofire~> 3.0
DEjson~> 1.0
 

MockingBird HTTP 模拟

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 注册到 URL 加载系统中

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,每个对象包含两个基础对象,requestresponse

request

  • 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示例

然后,将以下代码添加到你的测试中(以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中的匹配项,如果存在匹配项,则返回预定义的答案,否则请求将像平时一样通过网络

默认URL加载系统

如果你还没有转换到使用NSURLSession,你可以将MockingBird注册在更低的级别上

NSURLProtocol.registerClass(MockingBird)

但是请注意,如果你使用的是带有此设置的NSURLSession,它将不会适用于会话,这个只适用于不带NSURLSession的老版本