Что происходит за кулисами в XCTest по @тестирования?


Я знаю, что

@testable import MyModule

Дает возможность исследовать непубличные члены MyModule из модуля "test" (построенного с помощью "testTarget") MyModuleTests.

Мне нужна такая же функциональность в моем модуле" non-test". Не в производственном, а просто в отладочном режиме.

Мой вопрос: Знаете ли вы, как это сделать?

И связанный с этим (я думаю, более сложный вопрос): какая магия на самом деле происходит за @testable?

1 5

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