如何在 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 委托的主要内容,如果未能解决你的问题,请参考以下文章

从 XCTest 覆盖中忽略视图控制器

Swift (iOS) 代码覆盖率和 XCTest (mock)

避免在 XCTest UI 测试中恢复应用程序状态

XCTest 测试方法中的 KVO addObserver 逻辑崩溃

代码覆盖率数据生成失败

当按钮覆盖在tableview顶部时,如何防止tableview单元注册一个tap?