无法访问 UITableView 子类的 属性

Unable to access property of UITableView subclass

我正在尝试测试方法 ReloadData() 是否在更新数据源时由 UITableView 的实例调用。

我创建了一个名为 MockTableView 的 UITableView 的子class。它有一个名为 reloadDataGotCalled 的布尔值,当重载函数 reloadData() 被调用时,它被设置为 true。然后我尝试从我的测试 class 中访问 属性 以测试它是否为真。

然而,当我尝试这样做时,编译器给我的消息是 "Value of type 'UITableView' has no member 'reloadDataGotCalled'"

我不确定为什么要这样做,因为据我所知,我已经将该值设置为 'MockTableView' 类型,应该有那个成员?

// 包含我要测试的 tableView 插座的 ViewController。

class ItemListViewController: UIViewController {

    let itemManager = ItemManager()

    @IBOutlet var tableView: UITableView!
    @IBOutlet var dataProvider: (UITableViewDataSource & UITableViewDelegate & ItemManagerSettable)!

    @IBAction func addItem(_ sender: UIBarButtonItem) {
        if let nextViewController = storyboard?.instantiateViewController(identifier: "InputViewController") as? InputViewController {
            nextViewController.itemManager = itemManager
            present(nextViewController, animated: true, completion: nil)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = dataProvider
        tableView.delegate = dataProvider
        dataProvider.itemManager = itemManager
    }

}

//我的测试class

class ItemListViewControllerTest: XCTestCase {

    var sut: ItemListViewController!

    override func setUp() {
        //Given
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(identifier: "ItemListViewController")
        sut = (viewController as! ItemListViewController)
        //When
        sut.loadViewIfNeeded()
        }

// 我试图将 sut.tableView 分配给 mockTableView

的测试
func test_TableView_IsReloadedWhenItemAddedToItemManger() {
        let mockTableView = MockTableView()
        sut.tableView = mockTableView
        let item = ToDoItem(title: "Foo")
        sut.itemManager.add(item)
        sut.beginAppearanceTransition(true, animated: true)
        sut.endAppearanceTransition()
        XCTAssertTrue(sut.tableView.reloadDataGotCalled) // <- this is where I'm getting the compiler message "Value of type 'UITableView' has no member 'reloadDataGotCalled'"
    }

}

// 我的 mockTableView subclass 在 ItemListViewControllerTests

的扩展中
extension ItemListViewControllerTest {

    class MockTableView: UITableView {

        var reloadDataGotCalled = false

        override func reloadData() {
            super.reloadData()
            reloadDataGotCalled = true
        }
    }

}

我期待它应该编译,然后测试应该失败,因为我还没有编写代码让它通过?

您已将 ItemListViewController 中的 tableView 实例定义为 UITableView。因此,您无法使用该实例访问 MockTableView 的 属性。

您只能从子级访问父级的属性,反之亦然。如果您仍想访问 属性,您可以尝试类似下面的代码片段。

XCTAssertTrue((sut.tableView as! MockTableView).reloadDataGotCalled)

希望对您有所帮助。