2015-04-06 85 views
2

我试图用swift测试UICollectionViewDataSource,但在尝试出队时发生异常。异常看起来好像它没有注册重用标识符的类。在我的故事板我注册类和标识,所以当我运行应用程序工作正常,但我想在隔离UICollectionView在快速单元测试中出队引发异常

// 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") 

    } 

} 

回答

2

有趣的是,这个理由测试引发了一个例外,因为我从未将collectionViewdataSource连接在一起。我认为这意味着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") 
} 
相关问题