Выбор ответа Senior Производительность и тестирование обновлено

Тестирование кода со временем

Вопрос

View model показывает подсказку через 5 секунд бездействия (try await Task.sleep(for: .seconds(5))). Как протестировать это быстро и стабильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Внедрить Clock и в тесте подставить часы, продвигая время вручную. С Swift 5.7 есть протокол Clock (ContinuousClock, SuspendingClock), и код может спать через clock.sleep(for:).

Варианты ответа

  1. Ждать в тесте 5 секунд с XCTestExpectation и таймаутом 6 секунд
  2. Внедрить Clock и в тесте подставить часы, продвигая время вручнуюправильный ответ
  3. Уменьшить задержку до 0 через #if DEBUG прямо в коде view model
  4. Запускать такой тест только на CI, где время ожидания не мешает

Разбор

С Swift 5.7 есть протокол Clock (ContinuousClock, SuspendingClock), и код может спать через clock.sleep(for:). В тесте подставляют часы, время которых продвигается вручную, и тест проходит мгновенно и детерминированно. Реальное ожидание делает тесты медленными и нестабильными. #if DEBUG меняет поведение и не проверяет логику. Перенос на CI проблему не решает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.