UICollectionView повышение извлечения исключение в Свифт-модульный тест


Я пытаюсь проверить свой UICollectionViewDataSource с помощью swift, но он вызывает исключение при попытке деэквьюировать ячейку. Исключение похоже на то, что он не регистрирует класс для повторного использования идентификатора. В моей раскадровке я регистрирую класс и идентификатор, поэтому при запуске приложение работает нормально, но я пытаюсь тестировать в изоляции

//  CollectionViewDataSource.swift
import UIKit

class CollectionViewDataSource : NSObject, UICollectionViewDataSource {

  private var items = [MediaItem]()

    init(items: [MediaItem]) {
      self.items = items
    }

  func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.items.count
  }

  func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
  }

  func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as MediaItemCell

      // .. cell property setting

      return cell
  }

}

Тестовый файл

//  CollectionViewDataSourceTests.swift
import UIKit
import XCTest

class CollectionViewDataSourceTests: XCTestCase {

  var dataSource: CollectionViewDataSource!
    var collectionView: UICollectionView?

    override func setUp() {
      super.setUp()

        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        let size = CGRect(x: 0, y: 0, width: 100, height: 100)
        collectionView = UICollectionView(frame: size, collectionViewLayout: layout)

        let movieA = Movie(title: "Title", year: 1980, slug: "", banner: "")
        let movieB = Movie(title: "", year: 1980, slug: "", banner: "")
        let items = [movieA, movieB]
        dataSource = CollectionViewDataSource(items: items)

    }

  // This crashes when attempting to dequeue a cell. It's as if the collection
  // view never registers the class properly
  func testDataSourceReturnsACell() {
    let indexPath = NSIndexPath(forItem: 0, inSection: 0)

      // Register the cell
      collectionView!.registerClass(MediaItemCell.self, forCellWithReuseIdentifier: "Cell")
      let cell = dataSource.collectionView(collectionView!, cellForItemAtIndexPath: indexPath) as MediaItemCell
      XCTAssert(cell.textLabel.text == "The Shawshank Redemption", "Data source should set cell text")

  }

}
1 2

1 ответ:

Интересно, что причина, по которой этот тест вызвал исключение, заключается в том, что я никогда не связываю collectionView и dataSource вместе. Я предполагаю, что это означает, что UICollectionView не позволит вам зарегистрировать ячейку без источника данных. Ниже исправлен код:

func testDataSourceReturnsACell() {
    let indexPath = NSIndexPath(forItem: 0, inSection: 0)
    collectionView!.dataSource = dataSource // d'oh
    collectionView!.registerClass(MediaItemCell.self, forCellWithReuseIdentifier: "Cell")
    let cell = dataSource.collectionView(collectionView!, cellForItemAtIndexPath: indexPath) as MediaItemCell
    XCTAssert(cell.textLabel.text == "The Shawshank Redemption", "Data source should set cell text")
}