> Как решить проблему тестирования синглтона с использованием моков (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: NetworkServiceProtocol
init(networkService: NetworkServiceProtocol = NetworkService.shared) {
self.networkService = networkService
}
func processData() -> String {
return networkService.fetchData().uppercased()
}
}
// 4. Мок для тестирования
class MockNetworkService: NetworkServiceProtocol {
var fetchDataCalled = false
var mockData = "mock data"
func fetchData() -> String {
fetchDataCalled = true
return mockData
}
}
// 5. Тест
func testProcessData() {
let mockService = MockNetworkService()
let dataManager = DataManager(networkService: mockService)
let result = dataManager.processData()
XCTAssertEqual(result, "MOCK DATA")
XCTAssertTrue(mockService.fetchDataCalled)
}

Ключевые моменты:

  • Используем протокол для абстракции

  • Внедряем зависимость через init (с дефолтным значением синглтона)

  • В тестах подменяем синглтон на мок

  • Мок позволяет проверять вызовы и возвращать тестовые данные

Этот подход изолирует тесты от глобального состояния и делает их предсказуемыми.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью