【问题标题】:How to test closures in swift如何快速测试闭包
【发布时间】:2020-03-02 19:58:51
【问题描述】:

我是编写测试用例的新手,所以请不要提出任何建议。

问题 - 我如何为(闭包/高阶函数)而不是 api 调用闭包(不包括它们)编写测试用例, 为了获得100%的覆盖率,我只停留在这部分。

代码 -

init () {
    
   

    var items:[ReturnPaymentsOptionsModel] = []
    items.append(ReturnPaymentsOptionsModel(text: "Unexpected payment or \nunknown sender", isSelected: false))
    items.append(ReturnPaymentsOptionsModel(text: "Incorrect currency", isSelected: false))
    items.append(ReturnPaymentsOptionsModel(text: "Incorrect amount", isSelected: false))
    items.append(ReturnPaymentsOptionsModel(text: "Duplicate", isSelected: false))
    items.append(ReturnPaymentsOptionsModel(text: "Auction/Order cancelled", isSelected: false))
    items.append(ReturnPaymentsOptionsModel(text: "Charges exceeds the principle amount", isSelected: false))

    let observableToggleItems = Observable.just(items)
    
    let tappedItemAction = Observable.combineLatest(observableToggleItems, itemTapped)
        .map { argument -> [ReturnPaymentsOptionsModel] in // for this  closure im stuck
            
            let (items, indexPath) = argument
            var modifiedItems = items
            
            for index in modifiedItems.indices {
                
                if index == indexPath.row {
                    modifiedItems[index].isSelected.toggle()
                } else {
                    modifiedItems[index].isSelected = false
                }
            }
            
            return modifiedItems
        }.startWith(items)
    
    didFetchToggleItems = Observable.merge(getToggleItems.withLatestFrom(observableToggleItems), tappedItemAction)
}

【问题讨论】:

    标签: ios swift xctest xctestcase


    【解决方案1】:

    我假设你在这里测试 Rx 链没有问题,但闭包本身。

    如果你将整个闭包提取到一个可以直接进行单元测试的函数中,然后在 .map 中调用闭包中的函数会更好,类似于:

    function modifyItems(argument: ([Item], IndexPath)) -> [ITTReturnPaymentsOptionsModel] {
        // Your closure here
    }
    

    然后是这样的:

    let tappedItemAction = Observable.combineLatest(observableToggleItems, itemTapped)
            .map { modifyItems($0) }
            .startWith(items)
    

    这将允许您独立于 Rx 链对函数进行单元测试。

    【讨论】:

    • 我正在尝试这样的事情,我也是 Rx 的新手,所以我无法使用 Rx 链进行测试,如果你有时间请解释一下,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2020-12-27
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多