Всем привет! Сегодня поговорим о боли каждого iOS-разработчика: как тестировать приватные методы и свойства без нарушения принципов инкапсуляции. Оказывается, есть способ делать это элегантно!
Проблема, знакомая каждому.
Представьте ситуацию: у вас есть класс с приватным кэшем:
class PaymentProcessor {
private var cache: [String: Payment] = [:]
func processPayment(_ payment: Payment) {
// Сложная логика с использованием cache
}
}
Как протестировать, что кэш действительно работает? Раньше были только два неидеальных варианта:
🔹 Сделать cache internal: нарушаем инкапсуляцию.
🔹 Тестировать только через публичные методы: тесты становятся сложными и хрупкими.
Решение.
Swift предлагает атрибут
@_private(sourceFile:), который позволяет получить доступ к приватным членам в тестах:
#if ENABLE_PRIVATE_TESTS
@_private(sourceFile: "PaymentProcessor.swift")
import MyApp
#endif
func testCacheBehavior() {
let processor = PaymentProcessor()
// Теперь можем напрямую работать с приватным cache!
XCTAssertTrue(processor.cache.isEmpty)
}
Настройка.
🔹 Шаг 1: Включаем приватные импорты в основном модуле. В Package.swift:
.target(
name: "MyApp",
swiftSettings: [
.unsafeFlags(["-Xfrontend", "-enable-private-imports"])
]
)
🔹 Шаг 2: Условная компиляция в тестах:
#if ENABLE_PRIVATE_TESTS
@_private(sourceFile: "PaymentProcessor.swift")
import MyApp
#endif
🔹 Шаг 3: Настраиваем переменную окружения. В схеме тестирования:
ENABLE_PRIVATE_TESTS=1
🔗 Ссылка на подробную статью
💡 Вывод:
@_private(sourceFile:) - инструмент для серьезных проектов, где важны качественные тесты. Используйте его осознанно, всегда оборачивайте в флаги компиляции и будьте готовы к тому, что в будущих версиях Swift он может перестать работать.➡️ Подписаться на канал
Мобильный трудоголик