> Как реализовать 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: FileManagerProtocolinit(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 = falsefunc 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 inXCTAssertEqual(error as? ExportError, ExportError.emptyData)}}
Ключевые моменты:
- Используйте протокол для инверсии зависимостей
- Создавайте mock-объекты для имитации файловой системы
- Тестируйте граничные случаи (пустые данные, ошибки записи)
- Избегайте работы с реальными файлами в unit-тестах - это замедляет тесты и делает их ненадёжными
> Похожие задачи по mobile
Что такое сайд таблица (side table) в контексте weak ссылок и как она работает
Уровень: juniorКатегория: Технические вопросы
Компания: Bip.ru
Стек: iOS, Swift
Как реализовать функцию умножения числа на десять с обработкой символов
Уровень: seniorКатегория: Технические вопросы
Компания: Meta
Стек: iOS, Swift
Как реализовать функции setValue и getValue с поддержкой nil значений
Уровень: seniorКатегория: Технические вопросы
Компания: Revolut
Стек: iOS, Swift
Что такое side table
Уровень: juniorКатегория: Технические вопросы
Компания: Masterdata
Стек: iOS, Swift
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью