"Нет такого модуля" при использовании @testable в тестах Xcode Unit
Недавно я обновился до Xcode 7 beta 5. Я попытался добавить unit test в более ранний проект, но я получаю сообщение об ошибке "Нет такого модуля [myModuleName]" в строке @testable import myModuleName
.
![введите описание изображения здесь]()
Я пробовал
- очистка проекта с помощью Option Очистить папку сборки
- проверка того, что для параметра "Включить проверку работоспособности" (отладки) было установлено значение "Да" в "Параметры сборки"
- удаление цели тестирования, а затем повторное добавление пакета тестирования модулей iOS
Ничего из этого не сработало для этого проекта (но я получил тестирование для работы в другом проекте). Кто-нибудь еще имел эту проблему и решил ее?
Ответы
Ответ 1
Ответ, который работал у меня
Ответ заключался в том, что у меня были некоторые ошибки в моем проекте, которые делали сборку неудачной. (Это был только ваш стандартный каждый день ошибка в коде.) После того, как я исправил ошибки и сделал еще один чистый и сбор, он работал.
Обратите внимание, что эти ошибки сначала не отображались. Чтобы они отображались:
- Прокомментируйте весь тестовый файл, который дает вам ошибку "Нет такого модуля".
- Попробуйте снова запустить проект.
Если есть другие ошибки, они должны появиться сейчас. Исправьте их, а затем раскомментируйте свой тестовый файл. Ошибка "Нет такого модуля" для меня исчезла.
Если это не решит проблему для других людей, вы также можете попробовать следующее:
Очистить папку сборки
Откройте меню "Продукт", нажмите Option и нажмите "Очистить папку сборки..."
![введите описание изображения здесь]()
Убедитесь, что для параметра "Включить тестируемость" установлено значение "Да"
В Навигаторе проектов щелкните название своего проекта. Выберите "Параметры сборки" и прокрутите вниз до "Параметры сборки". Убедитесь, что параметр "Включить тестируемость" - "Да" (для отладки).
![введите описание изображения здесь]()
Удалите и снова добавьте целевую аудиторию
Если вы сделали другие вещи, я предполагаю, что вам, вероятно, не нужно это делать. Но если вы это сделаете, не забудьте сохранить те тесты Unit, которые вы уже написали.
Нажмите название проекта в Навигаторе проектов. Затем выберите целевую аудиторию. Нажмите кнопку минус (-) внизу, чтобы удалить ее.
![введите описание изображения здесь]()
Затем нажмите кнопку "плюс" (+) и выберите "Комплект тестирования модулей iOS", чтобы снова добавить его. Как вы можете видеть, вы также можете добавить пакет тестирования пользовательского интерфейса таким же образом.
Несколько других идей
- Убедитесь, что все необходимые классы являются членами вашей тестовой цели.
- Убедитесь, что вы добавили все необходимые библиотеки.
- Убедитесь, что имя модуля написано правильно (см. этот ответ).
Или...
Оставьте комментарий или ответ ниже, если вы нашли что-то еще, что сработало.
Похожие
Ответ 2
Пожалуйста, проверьте свое имя модуля, которое вы пытаетесь импортировать, с помощью @testable import "ModuleName"
. Имя модуля должно быть одинаковым на Target->Build Settings-> Product Module Name
Ответ 3
Проблема для меня заключалась в том, что цель развертывания iOS для тестов не была такой же, как и основная цель. Поэтому обязательно проверьте это.
В тестовой цели:
Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
Ответ 4
Так вот как я начал получать мой код для работы после попытки всех предлагаемых решений из предыдущих предложений.
- Я устанавливаю "Включить тестируемость" в "ДА" в настройках проекта "Проект"
- Я также устанавливаю 'Defines Module' в 'YES' в моих настройках проекта Project.
- Для обычного файла .swift в моем проекте, скажем, MyApp, я собирался написать тестовые примеры, у меня есть оба главный "MyApp" и
Задачи "MyAppUnitTests" проверены в разделе "Целевое членство".
- Затем я выбрал свой unit test файл (ы), объявленный '@testable import
MyApp "вверху, под" import XCTest "и только проверили
"MyAppUnitTests" в разделе "Назначение"
И все работало как шарм. Надеюсь, это поможет.
Ответ 5
Один из них, на который нужно обратить внимание, заключается в том, что если ваше имя модуля имеет символ тире в нем -
, тогда вам придется ссылаться на него с помощью подстроки вместо _
. По какой-то причине я подозревал, что это может быть проблемой, и это действительно моя проблема.
например. @testable import Ocean-Swift
становится @testable import Ocean_Swift
Просто еще одна вещь, если вы используете синтаксис @testable
, не забудьте указать свой производственный код в тестовой цели. Я обнаружил, что это вызовет необъяснимую странность.
Ответ 6
Это звучит как ошибка с настройками сборки обеих целей. Вы должны убедиться, что:
-
ENABLE_TESTABILITY
равно Да для обеих целей. - Значение
PRODUCT_MODULE_NAME
цели теста должно отличаться от значения в приложении.
Ответ 7
Еще одна вещь, которую нужно проверить: если у вас есть проект Objective-C, но вы пишете модульные тесты в Swift, убедитесь, что основная цель использует хотя бы один файл Swift!
Дополнительная информация:
Я работал над проектом Objective-C, но хотел написать модульные тесты в Swift.
Я добавил файл Swift в основную цель для создания необходимого файла ProjectName-Bridging-Header.h, написал мои тесты и все работало правильно.
Позже я удалил файл Swift, потому что думал, что мне это не нужно (весь основной целевой код находится в Objective-C... Я только писал тесты в Swift).
Я не заметил проблемы до более позднего времени, после того как я сделал "чистую/чистую папку сборки" и возникла проблема "Нет такого модуля". После некоторой царапины головы я добавил новый пустой файл Swift, и проблема исчезла.
Я тестировал его несколько раз с/без файла Swift, и он работает только с ним... поэтому мне нужно будет оставить пустой файл в проекте, конвертировать некоторые Objective-C в Swift, или добавить новый код в проект, написанный в Swift.
Ответ 8
Убедитесь, что при настройке схемы тестирования цель теста находится в списке.
Рядом с кнопкой воспроизведения выберите схему тестирования, затем Редактируйте схему..., перейдите в раздел "Построение", нажмите "плюс +" и выберите цель, с которой хотите провести тестирование.
В моем случае у нас есть внутренняя цель, с которой мы разрабатываем (с небольшими отличиями), и после слияния она была удалена из тестовой конфигурации.
![Edit test scheme]()
Ответ 9
Вот еще одна вещь, чтобы проверить, что нет в списке. Для меня это как-то связано с моей командой, возможно, потому что наш командный агент еще не согласился с последним лицензионным соглашением! Как только я выбрал другую команду в своих общих настройках цели, и затем я определил конкретную цель развертывания, такую как 12.1 или 11.0, внезапно предупреждение "Нет такого модуля" исчезло.
![enter image description here]()
![enter image description here]()
Ответ 10
Потратив пару дней на эти проблемы, я наконец-то занялся своим проектом. Проблема была в Bridging Header - путь в цели Tests не может быть пустым, если вы используете Bridging Header в своей главной цели ![Bridging Header can't be empty!!!]()
Надеюсь, это сэкономит время для кого-то.
Ответ 11
Моя проблема заключалась в том, что класс, который я хотел протестировать, должен был быть в отдельном модуле (Client API), но класс фактически был участником целевой программы, а не целевой средой. Изменение целевого членства в классе привело к ошибке импорта!
Ответ 12
Окружающая среда: Xcode Version 9.0 (9A235)
Сценарий: Тестирование структуры с открытым исходным кодом.
У меня была та же проблема: "Нет такого модуля".
Решение:
- Выберите целевую аудиторию.
- Выбор фаз сборки
- Добавить структуру, которая будет
тестируется через Link Binary...
![введите описание изображения здесь]()
Здесь тестовый файл:
![введите описание изображения здесь]()
Ответ 13
У меня была такая же проблема. Очистка папки сборки и перезапуск Xcode не сработала.
Что для меня работало, так это то, что настройка "Build Active Architecture Only" вашей тестовой цели и схемы соответствует настройке вашей целевой цели и схемы.
Ответ 14
Мое решение здесь.
Сначала нажмите OdeAlSwiftUITest.swift, затем отметьте Project TargetName в целевом членстве.
![enter image description here]()
Ответ 15
Я следовал за шагами выше, которые работали. Однако у моего проекта было еще несколько проблем. Я получил это предупреждение, и я не смог получить доступ к классам из моего основного проекта для тестирования в моей цели теста.
![Tests part of module - ignoring import]()
Я обнаружил, что имя вашего тестового целевого модуля продукта (YourTestTarget → Build Settings → search for product module
) не может совпадать с именем вашего проекта.
![Product Module Name for test target cannot be the same name as your project name]()
Как только я изменил имя модуля продукта для моей цели тестирования, все заработало.
![enter image description here]()
Ответ 16
Для меня решение было переименовать @testable import myproject_ios
в @testable import myproject
после того, как я обновил имя продукта target myproject-ios в настройках сборки/упаковке/имени продукта/из ${TARGET_NAME} в myproject.
Ответ 17
Это было исправлено для меня, когда я изменил цель развертывания с 9.3 до 11.0.
Общие> Цель развертывания> "11.0"
Ответ 18
Если вы используете xcodebuild и обнаружили эту проблему, рассмотрите возможность добавления флага рабочей области к команде build.
Изменил это
$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test
К этому
$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
Ответ 19
В цели тестирования параметров сборки проверьте хост-тестирование, оно принимает имя, заданное в PRODUCT_NAME. Это то имя, которое вы должны использовать в тестовых классах.
Я рекомендую не изменять PRODUCT_NAME (соответствует имени основной цели)
Ответ 20
![enter image description here]()
Нажмите MyAppTests.swift в навигаторе проекта и щелкните правой панели, проверьте ваш модуль в целевом членстве. Это работает в моем.
Ответ 21
Для тех, кто прокручивал до последнего ответа и до сих пор ничего не получалось, вот что сделал для меня, следуя всем остальным советам. Я использую Xcode 11:
В моем случае проблема возникла из-за того, что я изменил свое название продукта
- Я изменил имя продукта в настройках сборки моей основной цели на "Новое имя"
- Мне пришлось повторно выбрать хост-приложение для моей цели теста
Я не знал, что изменение названия продукта также изменит Имя модуля продукта, то есть то, которое используется для импорта модуля в моих тестовых файлах. Я изменил свой импорт следующим образом:
@testable import New_Name
Это сработало
Я надеюсь, что это помогает
Ответ 22
В моем случае у меня было 3 вопроса.
Во-первых, мне нужно было указать путь импорта в:
Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths
Во-вторых, я использовал Pod и мне пришлось также импортировать эти pod в свои тесты, используя:
target 'MyAppTests' do
inherit! :complete
end
В-третьих, я использовал заголовок моста в своей цели, поэтому мне пришлось указать заголовок моста таким же, как в тесте.
Ответ 23
Как описано в этом ответе, я добавлял тесты Swift в проект Obj-C. Решение состояло в том, чтобы добавить фиктивный класс Swift, после чего Xcode предложит добавить заголовок моста, а затем удалить класс Swift. После этого все было в порядке.
Ответ 24
В дополнение к другим перечисленным вещам мне пришлось добавить файл с классом, который я пытался проверить в своих источниках компиляции для модуля unit test ![введите описание изображения здесь]()
Ответ 25
Я думаю, что это могло произойти, потому что я удалил примеры тестов.
Я удалил комплект модульных тестов, затем снова добавил его, как показано на рисунках ниже, и все снова было в порядке.
![enter image description here]()
![enter image description here]()