无法访问UITableView子类属性,编译报错求助
解决UITableView Mock子类属性访问报错的问题
这个问题本质是Swift静态类型检查导致的:虽然你把sut.tableView赋值成了MockTableView实例,但sut.tableView的声明类型是UITableView(在ItemListViewController里是@IBOutlet var tableView: UITableView!),编译器只认这个声明类型,所以看不到子类MockTableView特有的reloadDataGotCalled属性。
这里有两种简单的解决方式:
方法1:直接持有Mock实例,避免类型转换
既然你已经创建了mockTableView变量,直接用它来断言就好,完全不需要通过sut.tableView访问,这是最安全清晰的写法:
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() // 直接访问我们持有的mock实例属性 XCTAssertTrue(mockTableView.reloadDataGotCalled) }
方法2:类型转换后访问属性
如果你一定要通过sut.tableView访问,可以把它强制转换成MockTableView类型(因为你确定已经赋值了这个类型的实例):
XCTAssertTrue((sut.tableView as! MockTableView).reloadDataGotCalled)
如果想让测试更健壮,避免强制转换崩溃,可以用可选绑定+断言失败提示:
guard let mockTableView = sut.tableView as? MockTableView else { XCTFail("TableView instance is not MockTableView") return } XCTAssertTrue(mockTableView.reloadDataGotCalled)
推荐用第一种方法,既简洁又避免了类型转换的潜在风险,测试代码的可读性也更高。
内容的提问来源于stack exchange,提问作者Kramer
相关产品推荐
相关产品推荐

