"Нет такого модуля" при использовании @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:

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

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

    @testable import New_Name

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

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

Ответ 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