【问题标题】:RxDataSources testingRxDataSources 测试
【发布时间】:2017-03-15 05:26:36
【问题描述】:

我创建了带有 RxDataSources 部分的 tableView。

视图控制器

viewModel.sectionsObservable
        .bindTo(tableView.rx.items(dataSource: viewModel.dataSource))
        .disposed(by: disposeBag)

sectionsObservable 在向数组添加新元素时发出事件。

我想测试一个正确的元素是否在正确的 indexPath 上。

func testGettingElementForIndexPath() {
    let element = Element()
    viewModel.addElement(element)
    let fetchedElement = viewModel.getElement(at: IndexPath(row: 0, section: 0))
    XCTAssertEqual(element, fetchedElement)
}

视图模型

func getElement(at indexPath: IndexPath) -> Element {
    return self.dataSource.sectionModels[indexPath.section].items[indexPath.row]
}

它可以在应用程序中运行,但测试失败。致命错误:索引超出范围

这都是因为异步。如何测试这种情况?


编辑 1: 视图模型

let elementsVariable = Variable<[TaskData]>([])
func addElement(_ element: Element) {
    elementsVariable.value.append(element)
}

var sectionsObservable: Observable<[Day]> {
    return elementsVariable.asObservable().map { (elements) -> [MySection] in
        ...
    }
}

【问题讨论】:

    标签: testing tdd rx-swift rxdatasources


    【解决方案1】:

    如果你说生产代码工作正常,那一定是一些愚蠢的错误。

    在生产代码中你有:

    .bindTo(tableView.rx.items(dataSource: viewModel.dataSource))

    在数据源内部设置项目

    检查你是否在测试代码中也有它

    【讨论】:

    • 我认为 dataSource.sectionModels 没有足够的时间进行更新,XCTAssert 异步运行速度更快
    • 您是否在某处更改了scheduler?如果不是,我认为这里不是这样。但也许...
    • 如果是这样我会说是架构设计的问题。像addElementgetElement 这样的方法是响应式代码气味(因为它们不是响应式而是命令式的):( 但是,您还没有回答我的问题 :D。您是否订阅了测试代码中某处的viewModel.dataSource
    • 周末我会在本地创建一些演示并尝试使用它。没有我面前的代码很难帮助你:P
    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2022-01-19
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多