单元测试单元为零

时间:2018-01-20 22:11:23

标签: swift unit-testing uicollectionviewcell

问题:

我用3个Dummy项加载了collectionView。然而Cell回来了,是不是因为视图从未加载过?你们如何测试你的collectionViewCell类型?

代码

var window: UIWindow?
var sut: QuestsDataProvider!
var collectionView: UICollectionView!

override func setUp() {
    super.setUp()
    bulletinController = BulletinController(collectionViewLayout: UICollectionViewFlowLayout())
    sut = QuestsDataProvider(acceptedQuests: false, completedQuests: false)
    bulletinController.collectionView?.dataSource = sut
    bulletinController.collectionView?.delegate = sut

    window = UIWindow()
    window?.makeKeyAndVisible()
    window?.rootViewController = bulletinController
}

func testCellIsQuestCell() {
    let indexPath = IndexPath(item: 1, section: 0)
    let cell = collectionView.cellForItem(at: indexPath)
    guard let count = sut.questManager?.quests.count else {return XCTFail()}
    XCTAssertTrue(cell is QuestCell)
}

编辑:

经过进一步测试,我能够在模拟器中看到虚拟Cell,并从numberOfitems(InSection: Int)获得准确的计数。但是我没有可见的细胞。

第二次编辑:

经过进一步研究,我发现问题是collectionView.cellForItem(at: indexPath)只显示可见细胞。单元测试集合视图单元类型是否有其他方法?

1 个答案:

答案 0 :(得分:1)

您需要先访问视图控制器的视图对象,然后才能完全初始化它的子视图组件。

您应该可以在设置功能中执行let _ = bulletinController.view。这是一种非常常见的方法,请参阅here

以下相关部分

func setupCreateOrderViewController()
{
    let bundle = NSBundle(forClass: self.dynamicType)
    let storyboard = UIStoryboard(name: "Main", bundle: bundle)
    createOrderViewController = storyboard.instantiateViewControllerWithIdentifier("CreateOrderViewController") as! CreateOrderViewController
    _ = createOrderViewController.view
}

引用链接:

但是最后一行发生了两件非常非常重要的事情:

  • 询问createOrderViewController的view属性会导致加载视图。结果调用viewDidLoad()方法。
  • 加载视图后,所有IBOutlet也都已设置好并可以在out测试中使用。例如,您可以声明文本字段出口的文本等于您期望的字符串。

编辑:

您也可以在视图控制器上调用loadViewIfNeeded(),这将执行相同的操作。

  

加载视图控制器的视图(如果尚未加载)。