3

如何为这种“成功”场景编写测试用例?

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。为什么代表返回零?以及如何测试这种情况?

4

2 回答 2

1

委托通常是弱引用。如果您首先将您分配MockTableViewDelegate给局部变量,则在print. 尝试以下操作:

let delegate = MockTableViewDelegate()
mockTableView.delegate = delegate
print("delegate===\(mockTableView.delegate)")
print(delegate)

需要第四行来保持对象为第三行而存在。

于 2016-05-03T14:16:46.600 回答
0

最后我发现这是 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);
于 2016-05-11T04:13:58.653 回答