Вступить в клуб →
средняявопросАрхитектура, тесты и релиз

ViewModel создаёт сервис внутри себя: почему это ломает тесты

final class OrdersViewModel {
    private let service = OrdersService(session: .shared)
    private(set) var orders: [Order] = []

    func load() {
        service.fetchOrders { [weak self] result in
            // ...
        }
    }
}

Нужно покрыть тестами три состояния экрана: пустой список, ошибка сети, успешная загрузка. Что мешает и как это исправить?

  • Зависимость зашита внутрь класса: сервис нужно принимать снаружи через протокол
  • Нужно подменить URLSession.shared через подмену методов в рантайме — это обычная практика для таких классов
  • Такие ViewModel покрываются только UI-тестами: unit-тест на экран с сетью написать невозможно
  • Проблема в замыкании: с переходом на async/await сервис станет подменяемым сам по себе

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела