UICollectionView单元在dequeueReusableCellWithReuseIdentifier上测试错误访问

时间:2015-06-25 23:52:07

标签: ios swift unit-testing exc-bad-access

总结我的问题我试图测试集合视图的数据源。我初始化一个视图控制器并调用scientific来初始化初始化自定义类以用作数据源的组件。这是我正在测试的课程。

程序以单元测试开始:

viewDidLoad()
class BubbleViewManagerTest: XCTestCase {

var viewController : DashboardViewController = DashboardViewController()
//var bubbleViewManager : BubbleViewManager = BubbleViewManager()

override func setUp() {
    super.setUp()

    let storyboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType))
    viewController = storyboard.instantiateViewControllerWithIdentifier("DashboardViewControllerId") as! DashboardViewController
    bubbleViewManager = viewController.bubbleViewManager
    viewController.loadView()
    viewController.viewDidLoad()
}

func testCellForItemAtIndexPath() {
    DataManager.singleton.dayActivities = []

    DataManager.singleton.addGoal(Period(name: "asdf", hour: 1, minute: 1, color: UIColor.blackColor(), priority: PeriodPriority.Low))

    var cell = bubbleViewManager.collectionView(viewController.bubbleView, cellForItemAtIndexPath: NSIndexPath(forRow: 0, inSection: 0)) as! BubbleCollectionViewCell

    XCTAssertEqual(cell.bounds.width, 45)
    XCTAssertEqual(cell.bounds.height, 45)
    XCTAssertNotNil(cell.bubbleView.period)

    DataManager.singleton.addGoal(Period(name: "asdf", hour: 1, minute: 1, color: UIColor.blackColor(), priority: PeriodPriority.Medium))
    DataManager.singleton.addGoal(Period(name: "asdf", hour: 1, minute: 1, color: UIColor.blackColor(), priority: PeriodPriority.High))

    var index = NSIndexPath(forRow: 1, inSection: 0)

    cell = bubbleViewManager.collectionView(viewController.bubbleView, cellForItemAtIndexPath: index) as! BubbleCollectionViewCell

该计划在 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let period: Period = DataManager.singleton.dayActivities[indexPath.row] var cell: BubbleCollectionViewCell = BubbleCollectionViewCell() switch period.priority { case .High: cell = collectionView.dequeueReusableCellWithReuseIdentifier(self.reuseIdentifierHighPriority, forIndexPath: indexPath) as! BubbleCollectionViewCell break; case .Medium: cell = collectionView.dequeueReusableCellWithReuseIdentifier(self.reuseIdentifierMediumPriority, forIndexPath: indexPath) as! BubbleCollectionViewCell break; case .Low: cell = collectionView.dequeueReusableCellWithReuseIdentifier(self.reuseIdentifierLowPriority, forIndexPath: indexPath) as! BubbleCollectionViewCell } // Give the bubble view the period for it to work on. cell.bubbleView.period = period // The bubble view needs to monitor a timer to redraw the bubble. Observer is assigned here. if let timer = cell.bubbleView.period?.globalTimer { timer.observer = cell.bubbleView } return cell }

行中断

我理解在自动释放对象或首次初始化对象时访问对象时会发生EXC_BAD_ACCESS。在我的情况下,我得到错误,并确保所有对象都被初始化,他们的引用很强(不弱)。我启用了NSZombies并且没有运气。

让我感到困惑的是cell = collectionView.dequeueReusableCellWithReuseIdentifier(self.reuseIdentifierMediumPriority, forIndexPath: indexPath) as! BubbleCollectionViewCell在线程中断之前已经执行过一次。

这可能与我在测试目标上运行的事实有关吗?当我在iOS模拟器上运行应用程序时,此代码按预期运行。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

通过在添加要测试的新数据后调用reloadData()来解决此问题。尝试模拟视图控制器以测试数据源时。必须调用viewController.collectionView.reloadData()。我从未考虑过这个问题,因为它是在viewDidLoad()调用中完成的,这是在添加数据之前完成的。