在单元测试中,我有一个简单的表视图,其中包含一堆基本单元格(仅带有标签的单元格)。我想使用cellForRow(at:)
访问单元格,因此我可以测试以编程方式选择和取消选择行,但此cellForRow
查询始终返回nil
。
在线some discussion我应该使用数据源tableView(_, cellForRowAt:)
。这是不我的意图。我只想测试单元格的可见性,测试选择和取消选择它们。要测试可见性,cellForRow(at:)
是正确的功能。此外,数据源tableView(_, cellForRowAt:)
无法保护超出范围的索引,而在此情况下,表格视图的cellForRow(at:)
将优雅地返回nil
,我也想测试我的表视图控制器。
但是,虽然我总是可以从tableViewController.tableView(_:cellForRowAt:)
获得有效的单元格,但我无法理解为什么我总是从nil
获得tableView.cellForRow(at:)
。我已在单元测试中验证了tableView
和tableViewController
都不是nil
,并且我还触发了视图加载:
_ = tableViewController.view
setUp()
中的。我还验证了tableView.indexPathsForVisibleRows
,结果 包含了我用于cellForRow(at:)
的索引路径。
当我通过LLDB和断点查询我的细胞时,有时我的细胞会正常显示。是否有可能我缺少异步等待的东西,因为可视化加载单元格可能在不同的线程中完成?我是否应该添加某种期望等待,直到单元格完全加载,然后才能使用cellForRow(at:)
访问它们,即使通过tableView.indexPathsForVisibleRows
已经返回预期的索引路径。我试图对此进行设置,但我不确定如何覆盖我的表格视图控制器init()
。
这是我在单元测试课程中的代码。
import XCTest
@testable import TableViewTest
class TableViewTestTests: XCTestCase {
private var appDelegate: AppDelegate!
private var tableVC: TableViewController!
override func setUp() {
super.setUp()
appDelegate = UIApplication.shared.delegate as! AppDelegate
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
tableVC = storyboard.instantiateViewController(withIdentifier: "TableViewController") as! TableViewController
// Trigger view load and viewDidLoad()
_ = tableVC.view
}
override func tearDown() {
super.tearDown()
}
func testGetFirstRow() {
let tableView = tableVC.tableView!
let indexPath0 = IndexPath(item: 0, section: 0)
let cell0 = tableView.cellForRow(at: indexPath0)
let visibleRows = tableView.indexPathsForVisibleRows
XCTAssert(visibleRows != nil) // PASSED
XCTAssert(tableView.indexPathsForVisibleRows!.contains(indexPath0)) // PASSED
XCTAssert(cell0 != nil) // FAILED
}
func testGetFirstRowDataSource() {
let tableView = tableVC.tableView!
let indexPath0 = IndexPath(item: 0, section: 0)
// This won't check for cell visibility.
let cell0 = tableVC.tableView(tableView, cellForRowAt: indexPath0)
let visibleRows = tableView.indexPathsForVisibleRows
XCTAssert(visibleRows != nil) // PASSED
XCTAssert(tableView.indexPathsForVisibleRows!.contains(indexPath0)) // PASSED
}