我有一个简单的tableview和一些行。每行都是带有xib文件的自定义单元格。我已经实现了委托和数据源,并且在我运行应用程序时工作正常。这是我实现它的方式。
class P: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
registerCell()
}
func registerCell() {
self.tableView.register(UINib(nibName: "PCell", bundle: nil), forCellReuseIdentifier: "cell")
}
#number of rows implemented here
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PCell
cell.titleLabel.text = "Great"
return cell
}
}
这段代码工作正常。
问题是当我尝试对tableView进行单元测试时我遇到了问题。这就是我的单元测试方式
class MockPController: PController {
}
class PControllerTests: XCTestCase {
let mpc = MockPController()
//THIS IS WORKING
func testNumberOfSections() {
mpc.viewDidLoad()
XCTAssertEqual(mpc.numberOfSections(in: mpc.tableView), 5)
}
func testTitleForPCells() {
mpc.viewDidLoad()
var cell = mpc.tableView(mpc.tableView, cellForRowAt: IndexPath(row: 0, section: 1)) as! PCell
//THE APP CRASHES AT THE CELLFORROWATINDEXPATH FUNCTION IN ACTUAL CODE - HERE "let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PCell"
//APP CRASHES HERE SAYING "Could not cast value of type 'Project.PCell' to 'ProjectTests.PCell'
}
}
在获得此应用程序崩溃时,我在MockPController中为registerCell()添加了一个覆盖函数,因此新的MockPController变为
class MockPController: PController {
override func registerCell() {
self.tableView.register(PCell.self, forCellReuseIdentifier: "cell")
}
}
添加此覆盖功能后,我没有在dequeueReusableCell崩溃,但现在应用程序崩溃说出口变量titleLabel为零。
因此,我认为由于覆盖registerCell()函数,它没有获得正确的单元实例。但没有它也应用程序崩溃。
我究竟做错了什么?
我搜索谷歌但我没有得到任何结果。
你似乎试图测试UITableView
的cellForRowAt:
方法。这不是你想要的。你想测试你的PCell
课程。为此,使用超类init PCell
实现init(style:reuseIdentifier:)
。然后像pcell.doSomethingThatSetTheTitle()
一样调用你自己的方法,断言你单元格的标题就是你所期望的。
编辑:
func testTitleForPCells() {
let cell = PCell(style: .default, reuseIdentifier: "anything")
let model = Model(title: "FOO")
cell.setMyModel(model)
XCTAssertEqual(cell.titleLabel.text, model.title)
}