gpt4 book ai didi

swift - 无法访问 UITableView 子类的属性

转载 作者:行者123 更新时间:2023-11-30 10:34:02 27 4
gpt4 key购买 nike

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

我创建了一个名为 MockTableView 的 UITableView 子类。它有一个名为 reloadDataGotCalled 的 bool 值,当调用重写函数 reloadData() 时,该 bool 值被设置为 true。然后,我尝试从测试类中访问该属性来测试它是否正确。

但是,当我尝试这样做时,编译器会给出消息“‘UITableView’类型的值没有成员‘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 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'"
}

}

//ItemListViewControllerTests 扩展中的我的 mockTableView 子类

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)

希望有帮助。

关于swift - 无法访问 UITableView 子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58464330/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com