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