单元测试在cellForRowAtIndexPath崩溃

问题描述 投票:1回答:1

我有一个简单的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()函数,它没有获得正确的单元实例。但没有它也应用程序崩溃。

我究竟做错了什么?

我搜索谷歌但我没有得到任何结果。

ios swift uitableview unit-testing
1个回答
1
投票

你似乎试图测试UITableViewcellForRowAt:方法。这不是你想要的。你想测试你的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)
}
© www.soinside.com 2019 - 2024. All rights reserved.