在UITableView中测试呈现的UITableViewCell

时间:2019-06-14 05:59:06

标签: ios swift uitableview tableview xctest

我正在用一个有趣的UIViewController测试一个简单的tableView

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }

    func setup() {
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "CustomTableViewCell")
    }


    var data = [1,2,3,4,5,6,7]
}

extension ViewController : UITableViewDelegate {

}

extension ViewController : UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath)
        cell.textLabel?.text = data[indexPath.row].description
        return cell
    }    
}

我想编写一个测试来检查所显示的单元格中是否显示了正确的数据。

我的测试如下:

var controller: ViewController?

override func setUp() {
    controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController") as? ViewController
}

func testViewCell() {
    guard let controller = controller else {
        return XCTFail("Could not instantiate ViewController")
    }

    let tableCell = Bundle(for: CustomTableViewCell.self).loadNibNamed("CustomTableViewCell", owner: nil)?.first as! CustomTableViewCell
    tableCell.textLabel?.text = "2"

    controller.loadViewIfNeeded()
    let actualCell = controller.tableView!.cellForRow(at: IndexPath(row: 0, section: 0) )

    XCTAssertEqual(actualCell, tableCell)
}

但是实际单元格为零。如何针对预期的单元格在视图控制器中测试呈现的单元格?

1 个答案:

答案 0 :(得分:1)

就您而言,我相信您也需要在表格视图上调用reloadData。试试:

func testViewCell() {
    guard let controller = controller else {
        return XCTFail("Could not instantiate ViewController")
    }

    let tableCell = Bundle(for: CustomTableViewCell.self).loadNibNamed("CustomTableViewCell", owner: nil)?.first as! CustomTableViewCell
    tableCell.textLabel?.text = "2"

    controller.loadViewIfNeeded()
    controller.tableView!.reloadData()
    let actualCell = controller.tableView!.cellForRow(at: IndexPath(row: 0, section: 0) )

    XCTAssertEqual(actualCell, tableCell)
}

通常对于这些情况,我也会担心视图控制器的大小。由于未将其放置在任何窗口中,因此在某些情况下可能会使用某些固有尺寸,如果将其设置为0,则您的像元也将不存在。也许您应该考虑创建一个具有固定大小(要测试的大小)的窗口,然后将视图控制器作为其根应用。

您还期望从XCTAssertEqual(actualCell, tableCell)获得什么?不确定,但是我会说这只会测试指针,并且总是会失败。您将需要实现自己的逻辑来检查相等性。