无法访问 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)
希望对您有所帮助。
我正在尝试测试方法 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)
希望对您有所帮助。