测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可 | MIT |
发布最后发布 | 2017年8月 |
SwiftSwift 版本 | 3.1 |
SPM支持 SPM | ✗ |
由 Przemysław Wośko 维护。
轻量级、强类型框架,提供类似的 Mockito 单元测试体验。由于 Swift 不支持很好地反射,我们可以在运行时构建模拟,该库依赖于 Sourcery,它扫描您的源代码并为您生成 Swift 代码。
主分支仍然是测试版,可能会有破坏性变更。
Mokcy 被设计来模拟协议。例如:
protocol ItemsModel: class {
func getExampleItems() -> Observable<[Item]>
func getItemDetails(item: Item) -> Observable<ItemDetails>
}
对于这个协议,生成的模拟看起来像:
// sourcery: mock = "ItemsModel"
class ItemsModelMock: ItemsModel, Mock {
// sourcery:inline:auto:ItemsModelMock.autoMocked
//swiftlint:disable force_cast
var invocations = [MethodType]()
var methodReturnValues: [MethodProxy] = []
//MARK : ItemsModel
func getExampleItems() -> Observable<[Item]> {
addInvocation(.getExampleItems)
return methodReturnValue(.getExampleItems) as! Observable<[Item]>
}
func getItemDetails(item: Item) -> Observable<ItemDetails> {
addInvocation(.getItemDetails(item: .value(item)))
return methodReturnValue(.getItemDetails(item: .value(item))) as! Observable<ItemDetails>
}
enum MethodType: Equatable {
case getExampleItems
case getItemDetails(item : Parameter<Item>)
static func ==(lhs: MethodType, rhs: MethodType) -> Bool {
switch (lhs, rhs) {
case (.getExampleItems, .getExampleItems): return true
case (let .getItemDetails(lhsParams), let .getItemDetails(rhsParams)): return lhsParams == rhsParams
default: return false
}
}
}
struct MethodProxy {
var method: MethodType
var returns: Any?
static func getExampleItems(willReturn: Observable<[Item]>) -> MethodProxy {
return MethodProxy(method: .getExampleItems, returns: willReturn)
}
static func getItemDetails(item: Parameter<Item>, willReturn: Observable<ItemDetails>) -> MethodProxy {
return MethodProxy(method: .getItemDetails(item: item), returns: willReturn)
}
}
private func methodReturnValue(_ method: MethodType) -> Any? {
let all = methodReturnValues.filter({ proxy -> Bool in
return proxy.method == method
})
return all.last?.returns
}
// sourcery:end
}
ItemsModelMock 可用于模拟返回值以及验证方法的调用
使用生成的模拟的示例测试
class ItemsViewModelTests: XCTestCase {
var sut: ItemsViewModel!
var itemsModelMock: ItemsModelMock!
override func setUp() {
super.setUp()
itemsModelMock = ItemsModelMock()
sut = ItemsViewModel(itemsModel: itemsModelMock)
}
override func tearDown() {
itemsModelMock = nil
sut = nil
super.tearDown()
}
func test_fetchItems() {
itemsModelMock.given(.getExampleItems(willReturn: Observable.just([]) ))
sut.fetchData()
Verify(itemsModelMock, .getExampleItems)
}
}
有关更多示例,请查看我们的示例项目。
有一些生成模拟的方法
watch
模式下改变了方法将在模拟中体现,在生成模拟后,目前有一种自动生成模拟的方法,您只需创建一个模拟文件,并添加 sourcert 注释为了运行示例项目,首先克隆仓库,然后在 Example 目录中运行 pod install
Mocky 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "Mocky"
Przemysław Wośko, [email protected]
Andrzej Michnia, [电子邮件 protected]
Mocky可以在MIT许可下使用。有关更多信息,请参阅LICENSE文件。