在单元测试

时间:2017-02-26 09:31:47

标签: swift uitableview unit-testing xctest tableviewcell

在单元测试中,我有一个简单的表视图,其中包含一堆基本单元格(仅带有标签的单元格)。我想使用cellForRow(at:)访问单元格,因此我可以测试以编程方式选择和取消选择行,但此cellForRow查询始终返回nil

在线some discussion我应该使用数据源tableView(_, cellForRowAt:)。这是我的意图。我只想测试单元格的可见性,测试选择和取消选择它们。要测试可见性,cellForRow(at:)是正确的功能。此外,数据源tableView(_, cellForRowAt:)无法保护超出范围的索引,而在此情况下,表格视图的cellForRow(at:)将优雅地返回nil,我也想测试我的表视图控制器。

但是,虽然我总是可以从tableViewController.tableView(_:cellForRowAt:)获得有效的单元格,但我无法理解为什么我总是从nil获得tableView.cellForRow(at:)。我已在单元测试中验证了tableViewtableViewController都不是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
    }

0 个答案:

没有答案