如何在 XCTest 中覆盖 tableview 委托
Posted
技术标签:
【中文标题】如何在 XCTest 中覆盖 tableview 委托【英文标题】:How to override tableview delegate in XCTest 【发布时间】:2016-05-03 13:27:45 【问题描述】:如何为这种“成功”场景编写测试用例?
if ([tblView.delegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)])
...
else
...
我尝试过在 swift 中创建以下模拟委托:
class MockTableViewDelegate:NSObject, UITableViewDelegate
@objc func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return 30
// MARK: Delegates
@objc func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
return UIView()
代码:
mockTableView.delegate=MockTableViewDelegate()
print("delegate===\(mockTableView.delegate)")
它打印零。我为数据源尝试过的相同模型,它正在返回数据源 obj。为什么代表返回零?以及如何测试这种情况?
【问题讨论】:
tblView.delegate
是否在 if 中?如果非零,它的类型是MockTableViewDelegate
?
tblView 的委托属性是通过 Storyboard 还是 Code 设置的?时间和上下文在委托和数据源属性中起着重要作用。测试用例在什么时候运行?
【参考方案1】:
委托通常是弱引用。如果您首先将MockTableViewDelegate
分配给局部变量,则在print
中使用时它应该仍然存在。请尝试以下操作:
let delegate = MockTableViewDelegate()
mockTableView.delegate = delegate
print("delegate===\(mockTableView.delegate)")
print(delegate)
第四行是为了让对象在第三行中存活。
【讨论】:
没有运气。我认为这与我发布的内容相同。 mockTableView的类型是什么?如果不是UITableView,那你对delegate属性做了什么吗? 这也可能不包含弱引用,因为您也没有使用委托。在底部添加print("delegate===\(delegate)")
。如果可行,请将委托成员属性添加到测试用例。
@LouFranco 是对的。如果您在第三行之后不使用delegate
,它可能会在第二行之后被释放。请查看我的更新答案。
我猜它的快速问题。因为我对数据源及其工作进行了同样的尝试。例如:1。让委托 = MockTableViewDelegate() 2. mockTableView.delegate = 委托 3. mockTableView.datasource = 委托。【参考方案2】:
最后我发现这是 ios 运行时的一个错误。解决此问题的一种方法是使用 OCMock,但它不适用于 Swift。所以我现在已经用 Objective-c 编写了。
UITableView *tableView = [[UITableView alloc]init];
UIView *headerView = [UIView new];
id delegateProtocolMock = OCMProtocolMock(@protocol(UITableViewDelegate));
tableView.delegate=delegateProtocolMock;
OCMStub([delegateProtocolMock tableView:tableView viewForHeaderInSection:0]).andReturn(headerView);
【讨论】:
以上是关于如何在 XCTest 中覆盖 tableview 委托的主要内容,如果未能解决你的问题,请参考以下文章
Swift (iOS) 代码覆盖率和 XCTest (mock)