TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.65K subscribers
Post #228 1.24K
🔢 Тестируем приватные свойства без нарушения инкапсуляции в Swift.

Всем привет! Сегодня поговорим о боли каждого 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 он может перестать работать.


➡️ Подписаться на канал
Мобильный трудоголик
  • 👍 18
  • 🔥 13
  • 🤔 6
  • 👀 5
  • ❤ 1
  • 🙏 1
  • 🗿 1
More from @hardworkerit
  1. Oct 6, 2026🔢 Swift 6.4: новая диагностика ретейн циклов. В Swift 6.4 появилась новая диагностика, ко…
  2. Oct 4, 2026🔢 SwiftUI: определение угла раскрытия iPhone Duo. В iOS 27.1 появился модификатор .onHing…
  3. Oct 2, 2026👣 Архитекторы, тестировщики и кодеры. Создаем мультиагентную команду Разработка с ИИ-аген…
  4. Oct 1, 2026🔢 Работа с Picture-in-Picture в iOS. Picture-in-Picture - системная функция iOS, которая…
  5. Sep 29, 2026🔢 Управление тулбарами на iPhone Duo. На iPhone Duo элементы управления навигацией, дейст…
  6. Sep 27, 2026🔢 Новые возможности Hashable в Swift 6.4 В Swift 6.4 добавили Hashable для нескольких тип…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →