【问题标题】:How to override tableview delegate in XCTest如何在 XCTest 中覆盖 tableview 委托
【发布时间】: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 设置的?时间和上下文在委托和数据源属性中起着重要作用。测试用例在什么时候运行?

标签: ios swift uitableview delegates xctestcase


【解决方案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);

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 2016-09-04
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多