将 pod 'MockFive'
添加到 Podfile 中,或将 MockFive.swift
从 MockFive
文件夹拖到您的项目中。
使您的模拟对象符合 Mock
协议,并在结构体或类中的任何地方添加 let mockFiveLock = lock()
。现在您可以使用 mock()
了!在函数体中调用 mock()
会在 myMockObject.invocations
中记录其调用,并在运行时实现替代实现。
使用 MockFive 允许对象报告它们被调用的哪些函数,并允许在运行时进行方法存根。由于 MockFive 使用反射生成其消息,mock()
方法保证了测试字符串始终与生产代码匹配。《Mock》协议可以被结构体模拟和类模拟采用。
协议模拟
import MockFive
struct CustomModel { var id: Int }
protocol MockworthyProtocol {
func method()
func complexMethod(arg: Int, model: CustomModel, others: Any?...) -> (Int, String)
}
struct MockImplementation: MockworthyProtocol, Mock {
let mockFiveLock = lock()
func method() { stub(identifier: "method") }
func complexMethod(arg: Int, model: CustomModel, others: Any?...) -> (Int, String) {
return stub(identifier: "complexMethod", arguments: arg, model.id, others) { (37, "stub string") }
}
}
var mock = MockImplementation()
// Invocation records
mock.method()
mock.complexMethod(7, model: CustomModel(id: 982), others: 7, nil, 0.23, [0,9]) // (37, "stub string")
mock.invocations[0] // "method()"
mock.invocations[1] // "complexMethod(_: 7, model: 982, others: [Optional(7), nil, Optional(0.23), Optional([0, 9])]) -> (Int, String)"
// Function stubbing
mock.registerStub("complexMethod") { (90, "Total \(42 + 9)") }
mock.complexMethod(9, model: CustomModel(id: 7)) // (90, "Total 51")
类模拟
import MockFive
struct CustomModel { var id: Int }
class MockworthyClass {
func method() {}
func complexMethod(arg: Int, model: CustomModel, others: Any?...) -> (Int, String) { return (9, "potatos") }
}
class MockwortheClassMock: MockworthyClass, Mock {
let mockFiveLock = lock()
override func method() { stub(identifier: "method") { super.method() } }
override func complexMethod(arg: Int, model: CustomModel, others: Any?...) -> (Int, String) {
return stub(identifier: "complexMethod", arguments: arg, model.id, others) { super.complexMethod(arg, model: model, others: others) }
}
}
// Invocation records
var mock = MockwortheClassMock()
mock.method()
mock.complexMethod(7, model: CustomModel(id: 982), others: 7, nil, 0.23, [0,9]) // (37, "stub string")
mock.invocations[0] // "method()"
mock.invocations[1] // "complexMethod(_: 7, model: 982, others: [Optional(7), nil, Optional(0.23), Optional([0, 9])]) -> (Int, String)"
// Function stubbing
mock.registerStub("complexMethod") { (90, "Total \(42 + 9)") }
mock.complexMethod(9, model: CustomModel(id: 9)) // (90, "Total 51")
在项目中的 TestTrack.playground
中查看更多示例!