Как переопределить делегат табличного представления в 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)

Четвертая строка требуется, чтобы объект оставался живым для третьей строки.

Другие вопросы по тегам