UITableViewCell的编程设置标签在单元测试中具有默认值

时间:2017-04-29 03:56:04

标签: swift unit-testing uilabel xctest

我没有按照编程方式设置标签文本的预期值;测试失败通知始终将它们设置为默认值。这些值在程序的实际运行中是正确的,但令人不安的是我无法通过单元测试。

我按如下方式设置我的单元测试:

class StopTableViewControllerTest: XCTestCase {
    var sut: StopTableViewController!

    let indexOfCell = 0
    var cellToTest: StopTableViewCell!

    let route = Route(name: "Clark", number: "22")
    // 22 is known to be North-South
    let direction = Direction.Northbound

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
        sut = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "StopTableViewController") as! StopTableViewController
        sut.route = route
        sut.direction = direction
        sut.loadView()
        sleep(1)
        cellToTest = sut.tableView(sut.tableView, cellForRowAt: IndexPath(row: indexOfCell, section: 0)) as! StopTableViewCell
    }
    ...
}

我在那里有sleep(1)给我的代码时间来进行REST调用并填充数据。

对于单元格的标签,我用属性观察器和对主线程的调用来设置它:

class StopTableViewCell: UITableViewCell {
    ...
    var stop = BusStop(ID: "Loading…", name: "") {
        didSet {
            DispatchQueue.main.async {
                self.label.text = self.stop.name
            }
        }
    }
    ...
}

这个var stop非常期待:

class StopTableViewController: UITableViewController {
    ...
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if dataLoaded {
            let cell = tableView.dequeueReusableCell(withIdentifier: "StopCell", for: indexPath) as! StopTableViewCell
            cell.stop = stops[indexPath.row]
            return cell
        } else {
            return tableView.dequeueReusableCell(withIdentifier: "StopCell", for: indexPath)
        }
    }
    ...
}

正如我所说,这在程序中表现良好,但以下测试失败。

func testStopCells_LabelOfCellMatchesStopName() {
    XCTAssertEqual(cellToTest.stop.name, cellToTest.label.text)
}

失败通知显示为XCTAssertEqual failed: ("Optional("Clark & Addison")") is not equal to ("Optional("Loading…")")。我完全陷入困境,因为程序运行实例中的同一个单元格会读取" Clark&阿狄森&#34 ;.

0 个答案:

没有答案