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 ответ:
Интересно, что причина, по которой этот тест вызвал исключение, заключается в том, что я никогда не связываю
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") }