«Модуль не скомпилирован для тестирования» при использовании @testable

147

Я пытаюсь использовать новое @testableобъявление Swift 2, чтобы выставить мои классы цели теста. Однако я получаю эту ошибку компилятора:

введите описание изображения здесь

Intervalsэто модуль, который содержит классы, которые я пытаюсь представить. Как мне избавиться от этой ошибки?

hgwhittle
источник

Ответы:

239

В вашей основной цели вам нужно установить Enable Testabilityопцию сборки на Да.

В соответствии с комментарием @earnshavian ниже, это следует использовать только в отладочных сборках в соответствии с примечаниями к выпуску Apple: «Параметр« Включить сборку тестируемости »следует использовать только в конфигурации отладки, поскольку он запрещает оптимизацию, которая зависит от того, чтобы не экспортировать внутренние символы из приложение или структура " https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

sgaw
источник
Привет, я получаю ту же ошибку, но не вижу опцию включения тестируемости и использую xcode 7. Любая идея, что мне делать?
user1601259
2
@ user1601259 - Вы можете найти эту опцию, выбрав проект верхнего уровня, перейдя в Настройки сборки и заглянув под заголовок Параметры сборки.
hgwhittle
@hgwhittle - когда я выбираю проект верхнего уровня, все, что я вижу в опциях сборки, это «формат информации отладки» и «проверка продукта сборки». Когда я выбираю цель в опциях сборки, я вижу «встроенный контент содержит быстрый код». Вот и все. Когда я ищу в настройках сборки, я не могу найти его. Это из-за xcode 7?
user1601259
1
Возможно, вы выбрали «Основные» в «Настройках сборки». Если вы выберете «Все» на левой стороне, вы увидите «Включить тестируемость»
Массив
1
Как именно это должно работать для сборок релизов, где тесты будут запускаться (так нужно @testable), но их нужно отправить в App Store? Если Enable Testabilityэто только для отладочных сборок, как обойти это? Должен ли я вытащить свой тестовый код для выпуска?
Тимгкарлсон
15

В моем случае я использовал пользовательскую конфигурацию сборки для тестирования (называемой Test), а также cocoapodsв качестве менеджера зависимостей

Мне пришлось добавить следующие строки в конец моего, Podfileчтобы включить тестируемость

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            if config.name == 'Test'
                config.build_settings['ENABLE_TESTABILITY'] = 'YES'
            end
        end
    end
end

По умолчанию cocoapodsнаборы ENABLE_TESTABILITYдля YESтолько для Debugсборки

Тим
источник
13

Убедитесь, что вы правильно установили свои флажки в соответствии со схемой приложения. Вы ДОЛЖНЫ ОТКЛЮЧИТЬ свои тестовые цели для Archive Build.

введите описание изображения здесь

Бартломей Семанчик
источник
2
Для получения дополнительной информации смотрите здесь: developer.apple.com/library/mac/technotes/tn2215/_index.html
P. Pawluś
8

Для тех из вас, кто испытывает это только после запуска Xcode Profiler: переключите конфигурацию построения профиля в управлении вашей схемой на конфигурацию с включенной тестируемостью, и в большинстве случаев это было бы отладкой:

введите описание изображения здесь

Владек Сурала
источник
4

Вероятно, это потому, что ваша основная цель Enable Testabilityустановлена ​​на NO. Вы должны установить его YESв схеме отладки (которая используется для запуска ваших тестов).

Если вы используете Carthage, эта проблема может быть вызвана импортом фреймворков с помощью @testable, потому что они построены по схеме выпуска.

В большинстве случаев импортировать фреймворки с этим префиксом плохая практика, поэтому вы можете избежать этого. Если вы не можете, вы должны Enable Testabilityв схеме релизов фреймворков. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

Самуэль Б.
источник
2
Как я могу избежать импорта фреймворков с использованием @testable? Какая хорошая практика здесь?
Джонатан Кабрера
3

Я начал получать эту ошибку при запуске тестов с использованием Bitrise.

В отличие от других пользователей , говорит, это не на Targetоснове, или на Schemaоснове, является на Configurationоснове. Выберите Target-> Build Settingsвкладка -> искать testability-> включить его в используемой конфигурации .

Обратите внимание, что Apple рекомендует включить это в конфигурации, которую вы используете для отладки, а не для AppStore.

rgkobashi
источник
0

Приведенное выше решение подойдет, если вы используете стручки / карфаген. Но если вы используете фреймворки из самой iOS, например «Контакты», вам нужно добавить путь к этим фреймворкам в «Пути поиска в библиотеке» цели вашего основного проекта. введите описание изображения здесь

nikBhosale
источник
0

Если вы пытаетесь протестировать фреймворк:

Перейти к цели тестирования -> Фаза сборки -> Фаза создания новых файлов копирования -> Выбрать рамки -> Добавить все рекурсивно используемые платформы

Запорожченко Александр
источник
0

Если случайно у вас есть

install! 'cocoapods',
         generate_multiple_pod_projects: true,
         incremental_installation: true

Тогда это способ сделать это.

    # generated_projects only returns results if the we run "pod install --clean-install"
    # or install a pod for the first time

    installer.generated_projects.each do |project|
        project.build_configurations.each do |configuration|
            configuration.build_settings["ENABLE_TESTABILITY"] = "YES" 
        end
    end
Нуно Гонсалвеш
источник
-3

Это не происходило в моих проектах до Xcode 8, но после того, как я обновился до Xcode 8, это меня озадачило.

Ответы, размещенные здесь, не помогли решить мои проблемы. Для меня я просто отбросил эти тесты, так как он не нужен. Поэтому снимите флажки с тестовых кнопок:

введите описание изображения здесь И теперь ошибка вышла.

Blaszard
источник
1
Если вам не нужны тесты, может быть лучше удалить тестовые цели из вашего проекта, а не удалять их из всех сборок.
Джонатан Кабрера