Тестирование настраиваемого UICollectionViewCompositionalLayout.list.

В iOS 14 Apple добавила композиционный макет представления коллекции, которые выглядят и ведут себя как UITableViews. Он основан на UICollectionViewCompositionalLayout и, как следствие, позволяет создавать очень сложные макеты представления коллекции с помощью небольшого количества кода.

Я считаю, что мы должны протестировать наши контроллеры представления.
Например, я часто пишу тесты, которые гарантируют, что настройка ячейки табличного представления работает должным образом.
Пример такого теста выглядит так:

func test_cellForRow_populatesCell() {
  // given
  sut.names = ["foo"]
  
  // when
  let indexPath = IndexPath(row: 0, section: 0)
  let cell = tableView.dataSource?.tableView(tableView, cellForRowAt: indexPath)
  
  // then
  XCTAssertEqual(cell?.textLabel?.text, sut.names.first)
}

(Этот код взят из моей книги « Разработка iOS на основе тестирования – Дай мне код» ).

Проверить заполнение ячейки табличного представления довольно просто.
Мы настраиваем источник данных, получаем из него ячейку и утверждаем, что соответствующие данные установлены для метки в ячейке.

UICollectionViewCompositionalLayout Совершенно иначе работает раскладка списка .
Я не хочу вдаваться в подробности в этом посте, как вы можете настроить представление коллекции с новым макетом списка. Сохраним это для более позднего поста. Все, что вам нужно знать, это то, что вы настраиваете UICellConfigurationState и сообщаете ячейке, что ей необходимо обновить конфигурацию. Затем ячейка вызывает метод, updateConfiguration(using:) и вы переопределяете этот метод для настройки ячейки.

Вы можете увидеть, как это работает, в CustomCellListViewController.swift образце кода, предоставленном Apple здесь .

Когда я попытался написать для этого тест, я столкнулся с проблемой, которая updateConfiguration(using:) вызывается после завершения моего теста.
Мне кажется, что UIKit откладывает вызов на следующий цикл выполнения.
Это означает, что для того, чтобы иметь возможность протестировать совокупность ячейки представления коллекции, мне также нужно было переместить утверждение в следующий цикл выполнения.
Инженер Apple @_mochs ответил на мои сообщения, что для запуска заполнения layoutIfNeeded ячейки должно быть достаточно вызова ячейки.

Итак, это работает:

func test_cellForItem_returnsConfiguresCell() {
    let item = Item(category: .music, title: "Foo", description: "Bar")
    sut.items = [item]
    sut.loadViewIfNeeded()

    let indexPath = IndexPath(item: 0, section: 0)
    let cell = collectionView.dataSource?.collectionView(collectionView, cellForItemAt: indexPath) as! CustomListCell

    let listContentConfiguration = cell.listContentView.configuration as! UIListContentConfiguration
    XCTAssertEqual(listContentConfiguration.text, item.title)
}

Кстати, это тест для примера кода, предоставленного Apple. Я добавил тесты, чтобы лучше понять, что происходит.

Ответить