我正在对一个tableView进行单元测试,它是否呈现一个单元格。
我发现tableView.cellForRow(at:)返回零,而tableView.dataSource?tableView(tableView:cellForRowAt:)返回正确的单元格。
这是我的单元测试代码。
it("renders one option text") {
let indexPath = IndexPath(row: 0, section: 0)
let cell = sut.tableView.dataSource?.tableView(sut.tableView, cellForRowAt: indexPath)
let cell2 = sut.tableView.cellForRow(at: indexPath)
expect(cell?.textLabel?.text).toEventually(equal("A1")) // test suceeded
expect(cell2?.textLabel?.text).toEventually(equal("A1")) // test failed
}所以我很好奇这两种方法的区别。
苹果的文档说,如果单元格不可见,tableView.cellForRow(at:)返回零,所以我理解tableView.cellForRow(at:)在单元测试时返回零,但当得到正确的值( cell )时,我不确定这两种方法的时间顺序是和。
发布于 2018-12-12 02:27:14
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell此方法用于根据tableView的要求生成或排列单元格。这不是UITableView成员方法。相反,它是一个协议方法,另一个作为数据源的对象将实现并返回该值。因此,无论是单元测试还是调试应用程序,它都会返回一个单元格。
tableView.cellForRow(at:) 此方法不是生成器方法。它是UITableView的一个成员方法,是eg的一种实用方法。对于选择的行,我们使用tableView.selectedRow。因此,它应该返回任何indexPath的单元格。
正如我们所知,UITableView不会创建与绘制的行相等的单元格。假设您想要绘制100行,那么UITableView只创建除了可见的单元格之外的几个额外的单元格。因此,如果您传递任何不在可见行中的indexPath,则实际上该单元格不存在。因为tableview正在等待您滚动并重用未使用的单元格。因此,无论您是在进行单元测试还是在应用程序上工作,它都会显示为不可见的单元格为零。
发布于 2018-12-12 02:26:21
tableView.dataSource?tableView(tableView:cellForRowAt:)总是将一个新的单元格排出队列。除非tableView是那个叫它的,否则它不是正在展出的那个。
https://stackoverflow.com/questions/53735018
复制相似问题