Mocky 0.0.4

Mocky 0.0.4

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2017年8月
SwiftSwift 版本3.1
SPM支持 SPM

Przemysław Wośko 维护。



Mocky 0.0.4

  • 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)
    }
}

有关更多示例,请查看我们的示例项目。

模拟生成

有一些生成模拟的方法

  1. watch 模式下改变了方法将在模拟中体现,在生成模拟后,目前有一种自动生成模拟的方法,您只需创建一个模拟文件,并添加 sourcert 注释
  2. 手动生成的模拟
  3. 构建脚本文档

路线图

  • [x] 以优雅的方式模拟协议
  • [x] 模拟生成模板
  • [x] 示例项目
  • [x] 使用变量模拟协议(目前支持 IUO 和可选类型)
  • [ ] 没有名称冲突的方法签名生成
  • [ ] 使用单元测试覆盖框架代码库的 95%
  • [ ] 将 .swifttemplate 重构为 .stencil 模板,以提高生成性能
  • [ ] 为模板添加单元测试
  • [ ] 支持 tvOS、Linux 和 MacOS
  • [ ] Swift 包管理器支持
  • [ ] Carthage 支持

示例

为了运行示例项目,首先克隆仓库,然后在 Example 目录中运行 pod install

要求

安装

Mocky 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod "Mocky"

作者

Przemysław Wośko, [email protected]

贡献者

Andrzej Michnia, [电子邮件 protected]

许可

Mocky可以在MIT许可下使用。有关更多信息,请参阅LICENSE文件。