"Немає такого модуля" при використанні @testable у тестах модуля Xcode


168

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

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

я намагався

  • очищення проекту за допомогою Optionпапки «Чиста збірка»
  • перевіряючи, що для параметра "Увімкнути тестуваність" (налагодження) встановлено значення Так в параметрах збірки
  • видалення цілі тестування та повторне додавання пакета тестування блоку iOS

Ніщо з цього не працювало на цей проект (але я пройшов тестування для роботи в іншому проекті). Хтось ще мав цю проблему і вирішив її?



Якщо ви будуєте з командного рядка з xcodebuild, не забудьте додати прапор -workspace для вашої команди build. Я вирішив це питання на моїй традиційній побудові таким чином.
Віктор 'Кріс' Кабрал

Відповіді:


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та натисніть "Очистити папку збірки ..."

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

Переконайтесь, що для параметра Увімкнути тестовість встановлено значення Так

У Навігаторі проектів натисніть назву проекту. Виберіть "Налаштування побудови" та прокрутіть вниз до "Параметри збирання". Переконайтесь, що Enable Testability (Так) (для налагодження).

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

Видаліть і повторно додайте ціль Тестів

Якщо ви зробили інші речі, я гадаю, що вам, мабуть, цього не потрібно. Але якщо це зробити, не забудьте зберегти будь-які одиничні тести, які ви вже написали.

Клацніть назву проекту в Навігаторі проектів. Потім виберіть ціль тестів. Натисніть кнопку мінус (-) внизу, щоб видалити її.

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

Потім натисніть кнопку плюс (+) і виберіть пакет iOS Unit Testing Bundle, щоб знову додати його. Як бачите, ви також можете додати пакет тестування інтерфейсу користувача таким же чином.

Ще кілька ідей

  • Переконайтесь, що всі необхідні класи є членами вашої тестової цілі.
  • Переконайтеся, що ви додали всі необхідні бібліотеки.
  • Переконайтесь, що назва модуля написана правильно (див. Цю відповідь ).

Або ...

Залиште коментар або відповідь нижче, якщо ви знайшли щось інше, що спрацювало.

Пов'язані


2
Тут виникають ті ж проблеми, що і з Xcode 7 beta 5. На жаль, описані вище кроки, здається, не вирішують цю проблему - модуль як і раніше вважається "немає такого модуля" Утиліта ". Єдина відмінність від ваших знімків екрану полягає в тому, що я намагаюся змусити це працювати з папкою тестів інтерфейсу користувача (у моєму випадку GlimpulseUITests). Можливо, @testable не працює з тестовою ціллю інтерфейсу користувача?
Зак

5
*** ВАЖЛИВО *** Якщо ви видалите та повторно додасте тестову ціль, вона відтворить порожній тестовий шаблон, що замінить існуючі тести. Не забудьте зберегти свої тестові джерела перед цим.
Полн

2
Для мене навіть мої індивідуальні заняття не відображалися під час набору тексту ... Я нарешті зробив продукт> Очистити, перезапустив XCode. Коли він перезапустився, дав йому кілька секунд, щоб завершити індексацію, а потім вуаля всі мої посилання з'явилися без включення кожного класу як учасника тестової цілі.
Радживе Джайн

1
Крім того, якщо ви цього не пробували, клацніть ліворуч відсутній фреймворк, а потім праворуч виберіть "Цільове членство" та включіть його у свою одиницю тестової цілі.
albogdano

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 " вгорі, під " імпортувати XCTest ", і лише перевірив "MyAppUnitTests" у рамках цільового членства

І все працювало як шарм. Сподіваюся, це допомагає.


8
Увімкнути перевірку та визначити модуль - це те, що зробило трюк. Мені не потрібно було змінювати цільове членство для звичайних * .swift файлів.
Джордж Якуб

Я зробив усі вищезазначені кроки, але у мене все ще немає такої помилки модуля. мій проект - це швидкий мікс, хоча
Мікаел

@Mikael, ви пишете тести лише на файли Swift у своїй кодовій базі суміші Objc / Swift? (Я запитую, тому що останній раз, коли я перевірив, я думаю, що "@stastable import" працював лише для написання тестових випадків лише для файлів Swift, навіть у суміші баз коду Obj-c / Swift. Можливо, це вже змінилося до цього часу. Хтось мене виправить якщо я тут помиляюся).
Віка Свіфт

6
Я знайшов свою проблему. Це було тому, що дійсна архітектура моєї тестової цілі не була такою ж, як конфігурація вашої головної цілі. Зараз це працює. До речі, я тестую лише класи Swift в моєму випадку, я не пробував це для Obj-c
Mikael

3
Не слід додавати швидкі файли програми до своєї тестової цілі, це зробить їх вміст дублюватися під час запуску тестів.
Przemysław Wrzesiński

18

Одним з причин слід звернути увагу на те, що якщо назва вашого модуля має в ньому тире, -тоді вам доведеться посилатися на нього з підрядкою _. Я чомусь підозрював, що це може бути проблемою, і це справді було моїм питанням.

напр. @testable import Ocean-Swiftстає@testable import Ocean_Swift

Ще одна річ, якщо ви використовуєте @testableсинтаксис, не забудьте включити свій виробничий код у вашу тестову ціль. Я виявив, що це спричинить незрозумілі дивацтва.


1
всі не алфавітно-цифрові символи також можуть бути замінені на підкреслення. Моя ціль була в такому форматі App (Dev). App__Dev_
Тестовим

11

Це здається помилкою у налаштуваннях збірки обох цілей. Вам потрібно переконатися, що:

  • ENABLE_TESTABILITY дорівнює для обох цілей.
  • PRODUCT_MODULE_NAMEЗначення випробувальної мішені повинно відрізнятися від однієї програми.

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. Це спрацювало

Я сподіваюся, що це допомагає


7

Провівши пару днів на це питання, нарешті, я змусив його працювати над своїм проектом. Проблема була в мостовому заголовку - шлях у цілі тестів не може бути порожнім, якщо ви використовуєте мостиковий заголовок у своїй головній ціліМост заголовка не може бути порожнім !!!

Сподіваюсь, це комусь заощадить час.


5

Переконайтеся, що в налаштуваннях схеми тестової схеми в списку знаходиться ціль тесту.

Поруч із кнопкою відтворення виберіть схему тестування, потім відредагуйте схему ..., перейдіть до розділу Збірка, натисніть плюс + та виберіть ціль, на яку хочете протестувати.

У моєму випадку у нас є внутрішня ціль, яку ми розробляємо (кілька незначних відмінностей), і після об'єднання її було видалено з тестового конфігурації.

Редагуйте схему тестування


5

Ось ще одна річ, щоб перевірити, чи немає у списку. Для мене це мало відношення до моєї команди, можливо, тому, що агент нашої команди ще не погодився на останню ліцензійну угоду! Після того, як я вибрав іншу команду в загальних налаштуваннях моєї цілі, а потім вказав конкретну ціль розгортання, як-от 12.1 або 11.0, раптом попередження "Немає такого модуля" відійшло.

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

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


4

У моєму випадку у мене було 3 випуски. Першим було те, що мені довелося вказати шлях імпорту в:

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

Друге - це те, що я використовував Pods, і мені довелося імпортувати ці стручки на мої тести, використовуючи:

target 'MyAppTests' do
    inherit! :complete
end

Третій, як те, що я використовував мостиковий заголовок у своїй цілі, таким чином, мені довелося вказати мостиковий заголовок, щоб він був однаковим для тесту.


2

Моя проблема полягала в тому, що клас, який я хотів перевірити, повинен був знаходитись в окремому модулі (API-клієнт), але клас фактично був членом цілі програми, а не рамковою ціллю. Зміна цільового складу класу усунула помилку імпорту!


2

Навколишнє середовище: Xcode Версія 9.0 (9A235)
Сценарій: Тестування рамки з відкритим кодом.

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

Рішення:

  1. Виберіть тестову ціль.
  2. Виберіть фази збірки
  3. Додайте рамку для тестування через Link Binary ...

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

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


2

У мене був цей самий випуск. Очищення папки збірки та перезапуск Xcode не працювали.

Що для мене працювало, це те, щоб налаштування для "Тільки активної архітектури" вашої тестової цілі та схеми відповідало налаштуванню цілі та схеми вашого додатка.


2

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

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

Я виявив, що назва вашого модуля тестового цільового продукту (YourTestTarget -> Налаштування збірки -> пошук product module) не може бути таким же ім'ям, як назва вашого проекту.

Ім'я модуля продукту для тестової цілі не може бути таким же ім'ям, як назва вашого проекту

Як тільки я змінив назву модуля продукту для своєї тестової цілі, все працювало.

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


1

Я спробував усі відповіді тут, але червоний прапор не зникне. Але я змусив його працювати, просто "запустивши" порожній тест незалежно, і він очистився.

Я б хотів переконатися, що зроблено:

  • Хост-додаток
  • @testable import "Module_name" (переконайтесь, що ім'я модуля правильне)
  • Переконайтесь, що ціль розгортання тесту збігається з проектом
  • У XCTest не потрібно мати цільове членство

0

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


0

Це було виправлено для мене, коли я змінив ціль розгортання з 9,3 на 11,0.

Загальне> Ціль розгортання> "11.0"


це може бути більше у випадку зміни тренажерів, але це теж працювало для мене
RolandasR

0

Моє рішення тут.

По-перше, натисніть OdeAlSwiftUITest.swift, а потім перевірте проект TargetName в цільовому членстві.

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


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. Після цього все було добре.


-1

Крім інших перерахованих речей, мені довелося додати файл із класом, який я намагався перевірити, до своїх джерел компіляції для модульного модуля тестуваннявведіть тут опис зображення


-1

Я думаю, що це могло статися, оскільки я видалив приклади тестів.

Я вийняв тестовий пакет Unit, потім повторно додав його, як показано на малюнках нижче, і все знову було добре.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.