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 сервис станет подменяемым сам по себе
