Hua*_*ham 5 unit-testing uitableview tableviewcell xctest swift
在单元测试中,我有一个简单的表视图,其中包含一堆基本单元格(仅带有标签的单元格)。我想使用来访问单元格cellForRow(at:),因此我可以通过编程方式测试选择和取消选择行等内容,但是此cellForRow查询始终返回nil。
网上有一些讨论,我应该改用数据源tableView(_, cellForRowAt:)。这不是我的意图。我只想测试单元的可见性,测试选择和取消选择它们。要测试可见性,cellForRow(at:)是要使用的正确功能。此外,数据源tableView(_, cellForRowAt:)没有超出范围索引访问的保障,而在这种情况下,表视图cellForRow(at:)将正常返回nil,我也想在上面测试我的表视图控制器。
然而,尽管我总可以从得到一个有效的单元格tableViewController.tableView(_:cellForRowAt:),我不明白为什么我总是nil从tableView.cellForRow(at:)。我已经验证了tableView和tableViewController都不nil在我的单元测试中,并且还通过以下方式触发了视图加载:
_ = tableViewController.view
Run Code Online (Sandbox Code Playgroud)
在中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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1077 次 |
| 最近记录: |