我有一些带有一些行的简单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()函数,所以我猜它没有得到正确的单元格实例。但是没有它也会崩溃。
我做错了什么?
我搜索了谷歌,但我没有得到任何结果。
答案 0 :(得分:1)
您似乎正在尝试测试UITableView
的{{1}}方法。这不是你想要的。您想测试cellForRowAt:
课程。
为此,请使用超类init PCell
实现PCell
。然后像init(style:reuseIdentifier:)
一样调用你自己的方法,并断言你单元格的标题是你所期望的。
编辑:
pcell.doSomethingThatSetTheTitle()