Тестирование представленного UITableViewCell в UITableView - PullRequest
0 голосов
/ 14 июня 2019

Я тестирую простой tableView в UIViewController для развлечения

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 Ответ

1 голос
/ 14 июня 2019

В вашем случае, я полагаю, вам нужно будет также вызвать 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)?Не уверен, но я бы сказал, что это тесты только указатели и всегда будет терпеть неудачу.Вам нужно будет реализовать собственную логику для проверки равенства.

...