Как переопределить делегат табличного представления в XCTest
Как написать тестовый сценарий для этого сценария "успеха"?
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. Почему делегат возвращается ноль? а как проверить этот сценарий?
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);
Делегаты, как правило, слабые ссылки. Если вы назначите MockTableViewDelegate
к локальной переменной сначала он должен быть еще жив при использовании в print
, Попробуйте следующее:
let delegate = MockTableViewDelegate()
mockTableView.delegate = delegate
print("delegate===\(mockTableView.delegate)")
print(delegate)
Четвертая строка требуется, чтобы объект оставался живым для третьей строки.