使用XCTestCase将项目插入集合视图失败

时间:2017-08-22 14:23:34

标签: ios swift uicollectionview xctest

TL; DR

我做了示例项目以显示错误。您可以从以下位置克隆或下载:

https://github.com/JakubMazur/SO45820305

尝试对方案SO45820305Testing进行测试。它会崩溃

问题:

我的代码负责我的应用中的分页列表。每当新数据出现并进行解析时,它会将数据附加到我的VC中进行建模并插入到UICollectionView中:

func appendNewData(_ dataSet: [ExampleData]) {
    let currentItemsCount = self.collectionViewDataSet.count
    self.collectionViewDataSet.append(contentsOf: dataSet)
    var paths: [IndexPath] = [IndexPath]()
    for i in currentItemsCount...(currentItemsCount+dataSet.count-1) {
        paths.append(IndexPath(row: i, section: 0))
    }
    self.collectionView.performBatchUpdates({
        self.collectionView.insertItems(at: paths) /* crash on this line */
    }) { _ in
        //print("done")
    }
}

当应用程序正常启动时,这非常有用。所以我想测试一下这个方法。所以我写了一个简单的测试:

func testAppendNewData() {
    self.viewController.collectionViewDataSet = [ExampleData]()
    self.viewController.collectionView.reloadData()
    let newDataSet = [ExampleData(), ExampleData()]
    self.viewController.appendNewData(newDataSet)
    ...
}

所以这个测试一步一步走:

  1. 我的collectionViewDataSet中没有数据。对象已初始化但计数器应为0
  2. 然后我创建两个示例对象并尝试将其附加到我的模型中。
  3. 然后在这个测试中还有一些(断言检查成功添加的东西到模型)。但它在这里因错误而崩溃:
  4.   

    错误: - [Project.TestClass testAppendNewData]   :失败:捕获“NSInternalInconsistencyException”,“无效更新:   第0部分中的项目数无效。包含的项目数   在更新后的现有部分(2)必须等于   更新前该部分中包含的项目数(2),加上   或减去从该部分插入或删除的项目数量(2   插入,0删除)并加上或减去移入的项目数   或超出该部分(0移入,0移出)。“

    所以错误说我的计算错误,但实际上must be equal to the number of items contained in that section before the update (2),打扰了我。这两个项目如何在更新之前结束?有趣的是。它在生产应用程序中如何工作,在测试框架中不起作用?

    编辑: @fishinear正确指出,我不应该在不重新加载数据的情况下更改内容,因此我更新了我的代码。现在它就像之上,但仍然导致相同的问题

2 个答案:

答案 0 :(得分:1)

在测试期间,endResetModel()customer productlist xxxx 12345, yyyy 12345,67891, zzzz 101112,52693,89563, aaaa 12536 Expected Results : customer productlist xxxx 12345, aaaa 12536 之前没有调用,这就是崩溃的原因。

解决方案在=IF(COUNTIF($D$5:$D$500,AS10),1,0)

之前放置numberOfItemsInSection

答案 1 :(得分:0)

您正在更改数据源的完整内容,而不会告诉集合视图:

self.viewController.collectionViewDataSet = [ExampleData]()

之后你应该调用reloadData来更新集合视图:

self.viewController.collectionViewDataSet = [ExampleData]()
self.viewController.collectionView.reloadData()

let newDataSet = [ExampleData(), ExampleData()]
self.viewController.appendNewData(newDataSet)