«Нет такого модуля» при использовании @testable в модульных тестах Xcode

168

Недавно я обновился до Xcode 7 beta 5. Я попытался добавить модульный тест в более ранний проект, но я получаю сообщение об ошибке «Нет такого модуля [myModuleName]» в @testable import myModuleNameстроке.

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

Я попытался

  • очистка проекта с помощью OptionClean Build Folder
  • проверка того, что для «Включить тестируемость» (отладка) было установлено значение «Да» в параметрах сборки
  • удаление цели тестирования, а затем повторное добавление пакета тестирования iOS-модуля

Ничто из этого не работало для этого проекта (но я получил тестирование для работы в другом проекте). Кто-нибудь еще имел эту проблему и решил ее?

Suragch
источник
Если вы собираете из командной строки с помощью xcodebuild, обязательно добавьте флаг -workspace для вашей команды сборки. Я решил эту проблему на моем сборке travis таким образом.
Виктор «Крис» Кабрал
stackoverflow.com/a/46525992/1645229
Джон Роджерс

Ответы:

210

Пожалуйста, проверьте имя модуля, с которым вы пытаетесь импортировать @testable import "ModuleName". Имя модуля должно быть одинаковым наTarget->Build Settings-> Product Module Name

Вода Ион
источник
5
В большинстве случаев речь идет о названии модуля продукта. Проверьте spaceи_
onmyway133
5
быть осторожным -и _. Один из моих проектов имеет минус -в названии, но _вместо этого у модуля есть подчеркивание
бериллий
4
Я использовал ""идею, и получилExpected identifier in import declaration
abbood
1
@ onmyway133 был очень близок. В моем случае у меня было другое имя модуля продукта, отличное от названия моего проекта. Чтобы найти имя вашего модуля, Build Settingsвыберите ваш проект (не тест или тест пользовательского интерфейса), а затем найдите PRODUCT_MODULE_NAMEвсе, что показывается, есть то, что должно идти после@testable import
jonmecer
115

Ответ, который работал для меня

Ответ состоял в том, что в моем проекте были ошибки, из-за которых сборка не удалась. (Это была просто ваша стандартная ошибка в коде каждый день.) После того, как я исправил ошибки и сделал еще одну очистку и сборку, все заработало.

Обратите внимание, что эти ошибки не появлялись сначала. Чтобы заставить их появляться:

  • Закомментируйте весь тестовый файл, который выдает ошибку «Нет такого модуля».
  • Попробуйте запустить свой проект снова.

Если есть другие ошибки, они должны появиться сейчас. Исправьте их и затем раскомментируйте код тестового файла. Ошибка "Нет такого модуля" исчезла для меня.


Если это не решит проблему для других людей, вы также можете попробовать следующее:

Очистите папку сборки

Откройте меню «Продукт», удерживайте его Optionи нажмите «Очистить папку сборки ...»

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

Убедитесь, что для параметра «Включить тестирование» установлено значение «Да».

В Навигаторе проектов щелкните название вашего проекта. Выберите «Параметры сборки» и прокрутите вниз до «Параметры сборки». Убедитесь, что Включить тестируемость Да (для отладки).

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

Удалите и повторно добавьте цель тестов

Если вы сделали другие вещи, я думаю, что вам, вероятно, не нужно это делать. Но если вы это сделаете, не забудьте сохранить любые тесты модулей, которые вы уже написали.

Нажмите на название вашего проекта в Project Navigator. Затем выберите цель тестов. Нажмите кнопку со знаком минус (-) внизу, чтобы удалить его.

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

Затем нажмите кнопку со знаком «плюс» (+) и выберите «Пакет тестирования модулей iOS», чтобы снова добавить его. Как вы можете видеть, вы также можете добавить UI Testing Bundle таким же образом.

Несколько других идей

  • Убедитесь, что все необходимые классы являются членами вашей цели теста.
  • Убедитесь, что вы добавили все необходимые библиотеки.
  • Убедитесь, что имя модуля написано правильно (см. Этот ответ ).

Или...

Оставьте комментарий или ответ ниже, если вы нашли что-то еще, что работает.

Связанный

Suragch
источник
2
Имея все те же проблемы здесь, с Xcode 7 beta 5. К сожалению, описанные выше шаги, похоже, не решают проблему - модуль все еще выглядит как «нет такого модуля« Утилита »». Единственное отличие от ваших скриншотов состоит в том, что я пытаюсь заставить это работать с папкой тестов пользовательского интерфейса (GlimpulseUITests в моем случае). Возможно, @testable не работает с целью тестирования пользовательского интерфейса?
Зак
5
*** ВАЖНО *** Если вы удалите и повторно добавите свою цель теста, она заново создаст пустой шаблон теста, перезаписав существующие тесты. Обязательно сохраните свои тестовые источники, прежде чем делать это.
Паулн
2
Для меня даже мои отдельные классы не показывались при наборе текста ... Я наконец сделал Product> Clean, перезапустил XCode. Когда он перезапустился, дал ему несколько секунд для завершения индексации, а затем вуаля, все мои ссылки обнаружились без необходимости включать каждый класс в качестве члена цели теста.
Раджив Джайн
1
Также, если вы еще не пробовали это, нажмите на отсутствующий фреймворк слева, затем справа выберите «Целевое членство» и включите его в свой целевой юнит-тест.
Альбогдано
3
Перейдите к настройкам вашей основной цели -> «Имя модуля продукта» и посмотрите, соответствует ли оно имени модуля, который вы пытаетесь импортировать в своем тесте.
f0rz
64

Проблема для меня заключалась в том, что цель развертывания iOS тестов не была такой же, как основная цель. Так что не забудьте проверить это.

В вашей тестовой цели:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
Джесс
источник
После этого , что, я должен был установить , Enable Bitcodeчтобы Noна Test Bundle.
pableiros
2
Lol это работает, но как глупо из xcode, что он не выдает другую ошибку
J. Doe
31

Так вот как я начал работать над своим кодом, попробовав все предложенные решения из предыдущих предложений.

  • Я установил «Включить тестируемость» на «ДА» в настройках сборки проекта
  • Я также установил «Определить модуль» на «ДА» в настройках сборки моего проекта.
  • Для обычных файлов .swift в моем проекте, скажем, MyApp , для которого я собирался написать контрольные примеры, у меня и основные цели « MyApp », и « MyAppUnitTests » проверены в разделе « Целевое членство» .
  • Затем я выбрал файл (ы) модульных тестов, объявил « @testable import MyApp » вверху, под « import XCTest » и проверил только «MyAppUnitTests» в разделе « Целевое членство».

И все работало как шарм. Надеюсь это поможет.

Вик Свифт
источник
8
Включите тестируемость и определите модуль - вот что сработало. Мне не нужно было менять целевое членство для обычных файлов * .swift.
Джордж Якуб
Я сделал все вышеперечисленные шаги, но у меня все еще нет такой ошибки модуля. Мой проект - быстрый и смешанный, хотя
Микаэль
@Mikael, вы пишете тесты только для файлов Swift в вашей базе кодов смешанных кодов Objc / Swift? (Я спрашиваю, потому что, в прошлый раз, когда я проверял, я думаю, что '@testable import' работал только для написания тестовых случаев только для файлов Swift, даже в смеси кодовой базы Obj-c / Swift. Возможно, к настоящему моменту это могло измениться. Кто-то поправил меня если я здесь не прав).
Вика Свифт
6
Я нашел свою проблему. Это произошло потому, что допустимая архитектура моей цели тестирования не совпадала с конфигурацией допустимой архитектуры моей главной цели. Теперь это работает. Кстати, я тестирую только классы Swift в моем случае, я не дал ему попробовать Obj-c
Микаэль
3
Вы не должны добавлять файлы приложения swift к цели тестирования, они дублируют их содержимое при выполнении тестов.
Przemysław Wrzesiński
18

Следует обратить внимание на то, что если в имени вашего модуля есть тире, -то вместо этого вам придется ссылаться на него с подчеркиванием _. По какой-то причине я подозревал, что это может быть проблемой, и это действительно было моей проблемой.

например. @testable import Ocean-Swiftстановится@testable import Ocean_Swift

Еще одна вещь, если вы используете @testableсинтаксис, обязательно не включайте свой производственный код в цель тестирования. Я обнаружил, что это вызовет необъяснимую странность.

smileBot
источник
1
все не алфавитно-цифровые символы также могут быть заменены на подчеркивание. Моя цель была в этом формате App (Dev), тестируемый модуль сталApp__Dev_
mushcraft
11

Это звучит как ошибка с настройками сборки обеих целей. Вы должны убедиться, что:

  • ENABLE_TESTABILITY равно Да для обеих целей.
  • PRODUCT_MODULE_NAMEЗначение испытательной мишени должно отличаться от одного приложения.
yageek
источник
2
Это сработало для меня. Я использовал неправильное имя модуля. Я удаляю пробел вместо добавления _. ДВОЙНОЙ ПРОВЕРИТЬ
НАЗВАНИЯ
9

Еще одна вещь, которую нужно проверить: если у вас есть проект Objective-C, но вы пишете модульные тесты в Swift, убедитесь, что основная цель использует хотя бы один файл Swift!


Больше информации:

Я работал над проектом Objective-C, но хотел написать модульные тесты в Swift.

Я добавил файл Swift к основной цели, чтобы сгенерировать необходимый файл ProjectName-Bridging-Header.h, написал свои тесты и все работало правильно.

Позже я удалил файл Swift, потому что я думал, что он мне не нужен (весь основной код цели находится в Objective-C ... Я только писал тесты в Swift).

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

Я тестировал его несколько раз с / без файла Swift, и он работает только с ним ... поэтому мне нужно либо оставить пустой проект в проекте, либо преобразовать Objective-C в Swift, либо добавить несколько Новый код проекта написан на Swift.

Джим Роудс
источник
1
!! после 3 часов очистки удалив извлеченные данные, очистки, начиная с нуля 3 раза, я нашел ваш комментарий, который решил мою проблему !!! Спасибо !!!!
Марьям Фекри
Знаете ли вы, как получить доступ к классам Objective-C в тестовых классах Swift, потому что я импортирую модуль проекта, и в этом нет ошибки, но он все равно не распознает мои классы Objective-C. я должен сделать что-нибудь другое?
Марьям Фекри
Еще одно замечание, которое я хотел бы добавить, хотя в моем основном проекте ObjC есть хотя бы один файл Swift, для моей цели не было связующего заголовка. Следуя инструкциям по следующей ссылке под заголовком «Импортировать код в цель приложения», была решена возможность доступа к классам ObjC из тестов Swift. developer.apple.com/documentation/swift/...
Palmi
Я столкнулся с этим вопросом. Однако мне интересно найти способ избежать включения файла Swift, если это возможно, поэтому я задал вопрос здесь: stackoverflow.com/q/62965954/211292
ThomasW
На самом деле, кажется, что если вы не включите @testable import Fooстроку, ваши модульные тесты должны работать правильно.
ThomasW
9

Для тех, кто прокручивал до последнего ответа и до сих пор ничего не получалось, вот что сделал для меня, следуя всем остальным советам. Я использую Xcode 11:

В моем случае проблема заключалась в том, что я сменил название продукта

  1. Я изменил название своего продукта в настройках сборки моей основной цели на «Новое имя»
  2. Я должен был повторно выбрать хост-приложение для моей цели теста
  3. Я не знал, что изменение названия продукта также изменит название модуля продукта , то есть то, которое используется для импорта модуля в моих тестовых файлах. Я изменил свой импорт следующим образом:

    @testable import New_Name

  4. Это сработало

Я надеюсь, что это помогает

SwissMark
источник
7

Потратив пару дней на эти проблемы, я наконец-то занялся своим проектом. Проблема была в Bridging Header - путь в цели Tests не может быть пустым, если вы используете Bridging Header в своей основной целиЗаголовок моста не может быть пустым !!!

Надеюсь, это сэкономит время для кого-то.

Игорь П
источник
5

Убедитесь, что при настройке схемы тестирования цель теста находится в списке.

Рядом с кнопкой воспроизведения выберите схему тестирования, затем Редактируйте схему ..., перейдите в раздел «Построение», нажмите «плюс +» и выберите цель, с которой хотите провести тестирование.

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

Изменить схему теста

BrianHenryIE
источник
5

Вот еще одна вещь, чтобы проверить, что нет в списке. Для меня это было связано с моей командой, возможно, потому, что агент нашей команды еще не согласился с последним лицензионным соглашением! Как только я выбрал другую команду в общих настройках своей цели, и затем я определил конкретную цель развертывания, такую ​​как 12.1 или 11.0, внезапно предупреждение «Нет такого модуля» исчезло.

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

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

Дейв Леви
источник
4

В моем случае у меня было 3 вопроса. Во-первых, мне нужно было указать путь импорта в:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

Во-вторых, я использовал Pod и мне пришлось импортировать эти pod в свои тесты, используя также:

target 'MyAppTests' do
    inherit! :complete
end

В-третьих, я использовал заголовок моста в своей цели, поэтому мне пришлось указать заголовок моста таким же, как в тесте.

el3ankaboot
источник
2

Моя проблема заключалась в том, что класс, который я хотел протестировать, должен был находиться в отдельном модуле (клиент API), но этот класс был на самом деле членом цели приложения, а не цели платформы. Изменение целевого членства в классе исключило ошибку импорта!

Maciej Swic
источник
2

Среда: Xcode Version 9.0 (9A235)
Сценарий: тестирование инфраструктуры с открытым исходным кодом.

У меня была такая же проблема: «Нет такого модуля».

Решение:

  1. Выберите цель теста.
  2. Выберите этапы сборки
  3. Добавьте тестируемый фреймворк через Link Binary ...

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

Вот тестовый файл: введите описание изображения здесь

Фредерик С. Ли
источник
2

У меня была такая же проблема. Очистка папки сборки и перезапуск XCode не работали.

Что меня сработало, так это то, что параметр «Build Active Architecture Only» вашей цели и схемы тестирования соответствовал настройке цели и схемы вашего приложения.

Palmi
источник
2

Я следовал за шагами выше, которые работали. Однако у моего проекта было еще несколько проблем. Я получил это предупреждение, и я не смог получить доступ к классам из моего основного проекта для тестирования в моей цели теста.

Тестирует часть модуля - игнорирует импорт

Я обнаружил, что имя вашего тестового целевого модуля продукта (YourTestTarget -> Build Settings -> search product module) не может совпадать с именем вашего проекта.

Имя модуля продукта для цели тестирования не может совпадать с именем вашего проекта

Как только я изменил имя модуля продукта для моей цели тестирования, все заработало.

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

Брайан Норден
источник
1

Я попробовал все ответы здесь, но красный флаг не исчезнет. Но я заставил его работать, просто «запустив» пустой тест, и все прояснилось.

Вещи, которые я хотел бы убедиться, сделаны:

  • Хост-приложение
  • @testable import "Module_name" (убедитесь, что имя модуля указано правильно)
  • Убедитесь, что цель развертывания для теста совпадает с целью
  • XCTest не должен иметь целевого членства
Александр
источник
0

Для меня решение было переименовать @testable import myproject_ios в @testable import myproject после того, как я обновил имя продукта target myproject-ios в Настройках сборки / Упаковка / Имя продукта / с $ {TARGET_NAME} на myproject.

Матиас
источник
0

Это было исправлено для меня, когда я изменил цель развертывания с 9.3 до 11.0.

Общие> Цель развертывания> "11.0"

jacob_g
источник
это может быть больше в случае смены симуляторов, но это сработало и для меня
RolandasR
0

Мое решение здесь.

Сначала нажмите OdeAlSwiftUITest.swift, затем отметьте Project TargetName в целевом членстве.

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

Eyup
источник
8
Это не верно. Никогда не добавляйте свои тестовые файлы к своей цели.
smileBot
0

Если вы используете xcodebuild и обнаружили эту проблему, рассмотрите возможность добавления флага рабочей области к команде build.

Поменял это

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

К этому

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
Виктор Крис Кабрал
источник
0

В целевом тесте параметров сборки проверьте хост-тестирование, оно принимает имя, заданное в PRODUCT_NAME. Это то имя, которое вы должны использовать в тестовых классах.

Я рекомендую не изменять PRODUCT_NAME (соответствует имени основной цели)

Сэм
источник
0

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

Нажмите MyAppTests.swift в навигаторе проекта и щелкните правой панели, проверьте ваш модуль в целевом членстве. Это работает в моем.

Фирда Сахиди
источник
Вы не должны добавлять тестовые классы к своей цели приложения.
Алекс Мотор
-1

Как описано в этом ответе, я добавлял тесты Swift в проект только для Obj-C. Решением было добавить фиктивный класс Swift, после чего Xcode предложит добавить соединительный заголовок, а затем удалить класс Swift. Все было хорошо после этого.

funkybro
источник
-1

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

Мэтт Д
источник
-1

Я думаю, что это могло произойти, потому что я удалил примеры тестов.

Я удалил комплект модульных тестов, затем снова добавил его, как показано на рисунках ниже, и все снова было хорошо.

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

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

Деклан МакКенна
источник