Зачем DI — что меняется при тестировании?
Суть
Без DI объект сам создаёт зависимости: URLSession.shared, Date(), UserDefaults.standard, синглтон аналитики. В тесте их не заменить, поэтому тест:
- ходит в реальную сеть/БД — медленный и недетерминированный (flaky);
- не может проверить граничные случаи (ошибка сети, конкретная дата);
- оставляет побочные эффекты (записал в
UserDefaults, отправил событие).
С DI зависимости передаются через init, и тест подставляет тестовые двойники — stub (возвращает заготовленные данные), spy (записывает вызовы), fake (упрощённая рабочая реализация, например in-memory репозиторий). Тест становится изолированным, быстрым и повторяемым.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep