> Как реализовать unit test для функции записи данных в файл (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Revolut

Стек: iOS, Swift

> Пример ответа

Для unit-тестирования функции записи данных в файл в iOS-проектах на Swift следует изолировать код от реальной файловой системы. Основной подход - внедрение зависимости (dependency injection) через протокол, который абстрагирует работу с файловой системой.

Пример реализации:

SWIFT
// Протокол для абстракции файловой системы
protocol FileManagerProtocol {
func write(_ data: Data, to url: URL) throws
}
// Реальная реализация
class RealFileManager: FileManagerProtocol {
func write(_ data: Data, to url: URL) throws {
try data.write(to: url)
}
}
// Тестируемый класс
class DataExporter {
private let fileManager: FileManagerProtocol
init(fileManager: FileManagerProtocol = RealFileManager()) {
self.fileManager = fileManager
}
func saveData(_ data: Data, to url: URL) throws {
guard !data.isEmpty else { throw ExportError.emptyData }
try fileManager.write(data, to: url)
}
}
// Mock для тестирования
class MockFileManager: FileManagerProtocol {
var writtenData: Data?
var shouldThrowError = false
func write(_ data: Data, to url: URL) throws {
if shouldThrowError { throw NSError(domain: "test", code: 1) }
writtenData = data
}
}
// Unit-тест
func testSaveDataSuccess() {
let mock = MockFileManager()
let exporter = DataExporter(fileManager: mock)
let testData = "Hello".data(using: .utf8)!
let testURL = URL(fileURLWithPath: "/tmp/test.txt")
try? exporter.saveData(testData, to: testURL)
XCTAssertEqual(mock.writtenData, testData, "Данные должны быть записаны")
}
func testSaveDataEmptyData() {
let mock = MockFileManager()
let exporter = DataExporter(fileManager: mock)
let emptyData = Data()
let testURL = URL(fileURLWithPath: "/tmp/test.txt")
XCTAssertThrowsError(try exporter.saveData(emptyData, to: testURL)) { error in
XCTAssertEqual(error as? ExportError, ExportError.emptyData)
}
}

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

  • Используйте протокол для инверсии зависимостей
  • Создавайте mock-объекты для имитации файловой системы
  • Тестируйте граничные случаи (пустые данные, ошибки записи)
  • Избегайте работы с реальными файлами в unit-тестах - это замедляет тесты и делает их ненадёжными

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

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