在 UITableView 中测试呈现的 UITableViewCell

Testing the presented UITableViewCell in a UITableView

为了好玩,我正在 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)
}

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

在您的情况下,我相信您还需要在 table 视图上调用 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)
}

一般来说,对于这些情况,我也会担心视图控制器的大小。由于这没有放在任何 window 中,它在某些情况下可能会使用一些固有大小,如果将其设置为 0,则您的单元格也不会在那里。也许你应该考虑创建一个 window 具有固定大小(你想要测试的大小)并将你的视图控制器作为根应用到它。

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