Что мешает коду быть тестируемым: время, рандом, синглтоны, UserDefaults — и как ввести швы?
Суть
Код нетестируем, когда сам дотягивается до глобального мира: Date(), Int.random, UUID(), UserDefaults.standard, Analytics.shared, Task.sleep. Такие вызовы в тесте не перехватить, и результат зависит от часов, удачи и того, что оставили предыдущие тесты. Лечится это швами (seams, термин Майкла Фезерса) — местами, где поведение можно подменить, не редактируя саму логику. В Swift самый дешёвый шов — параметр init со значением по умолчанию: продакшен-код не меняется, а тест передаёт своё.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep