Что происходит за кулисами в XCTest по @тестирования?
Я знаю, что
@testable import MyModule
Дает возможность исследовать непубличные члены MyModule
из модуля "test" (построенного с помощью "testTarget") MyModuleTests
.
Мне нужна такая же функциональность в моем модуле" non-test". Не в производственном, а просто в отладочном режиме.
Мой вопрос: Знаете ли вы, как это сделать?И связанный с этим (я думаю, более сложный вопрос): какая магия на самом деле происходит за @testable
?
1 ответ:
Чтобы ответить на ваш вопрос, в целях отладки вы можете использовать это. Допустим, у вас есть рабочее пространство
Теперь создайте новыйMyAwesomeWkspace
и проект внутриMyAwesomeProject
.framework
он жеmodule
, называемыйMyAwesomeModule
. Внутри этого модуля создайте непубличный класс с именемPerson
.Если вы попытаетесь использовать класс
Person
внутриMyAwesomeProject
, выполнивimport MyAwesomeModule
, а затем что-то вродеlet p = Person()
, вы получите ошибку.Но если вы это сделаете
@testable import MyAwesomeModule
, волшебство произойдет, и теперь вы можете использовать класс.В основном
@testable
позволяет вам тестировать вещи, которые вы не объявляли публично. Аннотация работает только сimport
, как вы можете видеть его здесь.Таким образом, чтобы работать, цель компилируется с
-enable-testing
, так что вы можете иметь доступ к непубличным членам. По крайней мере, на основе того, что здесьПоскольку по умолчанию конфигурация сборки
debug
компилируется с-enable-testing
, пример, который я вам показал, будет работать. Но если вы измените конфигурацию сборки наrelease
, вы увидите сообщение об ошибкеModule .. was not compiled for testing
, так как конфигурацияrelease
не построена с флагом.Модель управления доступом Swift, описанная в разделе Управление доступом раздел языка программирования Swift (Swift 4), предотвращает внешняя сущность от доступа к чему-либо объявленному внутренним в приложении или рамки. По умолчанию, чтобы иметь возможность доступа к этим элементам из вашего тестовый код, вам нужно будет поднять их уровень доступа, по крайней мере, до общественные, снижающие выгоды типа безопасности Свифта.
Xcode предоставляет двухкомпонентное решение этой проблемы:
, Когда вы устанавливаете возможности тестирования, сборки-значение "Да", что true по умолчанию для тестовых сборок в новых проектах Xcode включает - включить-флаг тестирования во время компиляции. Это делает сущности Swift, объявленные в скомпилированном модуле, пригодными для более высокого уровня доступа. При добавлении проверяемый атрибут@, чтобы оператор импорта для модуль скомпилирован с включенным тестированием, вы активируете повышенный доступ для этого модуля в этой области. Классы и члены класса, отмеченные как внутренние или общественные ведут себя так, как если бы они были помечены как открытые. Другие структуры помечены как внутренние акты, как если бы они были объявлены публичными.
Еще здесь
Поздняя правка: одна из крутых частей swift-это открытый исходный код. Итак, если вы хотите погрузиться глубоко в "волшебство", проверьте его: https://github.com/apple/swift