> Как решить проблему тестирования синглтона с использованием моков (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Bip.ru
Стек: iOS, Swift
> Пример ответа
Основная проблема тестирования синглтона - его глобальное состояние, которое сохраняется между тестами и усложняет изоляцию. Для решения используем моки через протоколы и внедрение зависимостей.
Пример на Swift:
SWIFT// 1. Определяем протокол для синглтонаprotocol NetworkServiceProtocol {func fetchData() -> String}// 2. Реальный синглтонfinal class NetworkService: NetworkServiceProtocol {static let shared = NetworkService()private init() {}func fetchData() -> String {// Реальная сетевая логикаreturn "real data"}}// 3. Класс, использующий синглтон (с возможностью замены)class DataManager {private let networkService: NetworkServiceProtocolinit(networkService: NetworkServiceProtocol = NetworkService.shared) {self.networkService = networkService}func processData() -> String {return networkService.fetchData().uppercased()}}// 4. Мок для тестированияclass MockNetworkService: NetworkServiceProtocol {var fetchDataCalled = falsevar mockData = "mock data"func fetchData() -> String {fetchDataCalled = truereturn mockData}}// 5. Тестfunc testProcessData() {let mockService = MockNetworkService()let dataManager = DataManager(networkService: mockService)let result = dataManager.processData()XCTAssertEqual(result, "MOCK DATA")XCTAssertTrue(mockService.fetchDataCalled)}
Ключевые моменты:
-
Используем протокол для абстракции
-
Внедряем зависимость через init (с дефолтным значением синглтона)
-
В тестах подменяем синглтон на мок
-
Мок позволяет проверять вызовы и возвращать тестовые данные
Этот подход изолирует тесты от глобального состояния и делает их предсказуемыми.
> Похожие задачи по mobile
Как организовать сетевые вызовы в iOS проекте
В чем разница фабрики и билдера
В чем разница паттернов Bridge и Proxy
Какие проблемы с многопоточностью существуют, например race condition, data race, starvation, priority inversion, deadlock
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью