Вопрос проверяет понимание dependency injection и роли абстракций в тестируемом коде.
Если зависимость передается напрямую как конкретный класс, ее сложно заменить в тестах. Без протокола код жестко связан с реализацией. Это ограничивает возможность подмены поведения. Протокол позволяет использовать mock вместо реального объекта. Без него тестируемость остается низкой.
Внедрение зависимости само по себе не гарантирует тестируемость — важна форма этой зависимости.
Когда код зависит от конкретного класса:
Поведение зашито в реализацию
Нельзя подменить логику
Тест зависит от реальных побочных эффектов
Даже если объект передается извне, гибкости это не дает.
Протокол задает контракт поведения.
Код зависит от интерфейса
Реализация может быть любой
В тестах используется mock
protocol AnalyticsTracking {
func track(event: String)
}
Использование протокола:
Уменьшает связанность
Упрощает тестирование
Делает код расширяемым
Dependency injection без абстракции решает только половину задачи. Для тестируемого кода зависимость должна передаваться через протокол, а не через конкретный класс.