Не удается загрузить базовый модуль для XCTest

180

Я работаю в SWIFT над XCode и по умолчанию он создает тестовый файл, который ссылается на XCTest.

Когда я устанавливаю целевое членство для моего основного проекта, это вызывает эту ошибку

Не удается загрузить базовый модуль для XCTest

Если это целевое членство не установлено, тесты выполняются правильно, и все работает нормально.

PS: я новичок в Свифте, и это, вероятно, глупый вопрос (пожалуйста, просветите меня)

brduca
источник
17
Там нет тупых вопросов кузнечика, только тупые спрашивающие. ;-) Отличный вопрос, так как у всех, кто читает это, будет такая же проблема.
Lance Kind

Ответы:

168

Основной проект не связан с платформой XCUnit. Вам следует создать отдельную цель тестирования для вашего проекта, если она еще не существует, и добавить исходные файлы тестирования в эту цель.

  1. Выберите свой проект в Project Navigator. Это откроет настройки проекта в редакторе.
  2. Нажмите кнопку «+» в нижней части столбца со списком ваших целей.

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

  1. Если вы работаете над шаблоном проекта iOS , выберите iOS > Test > iOS Unit Testing Bundle.

    Если вы работаете над шаблоном проекта OS X , выберите OS X > Test > OS X Unit Testing Bundle.

ПвК
источник
3
Между тем для iOS он называется iOS UITesting Bundle (используйте его для UI-тестов) или iOS Unit-Testing Bundle (это для
модульных
184

Дважды проверьте, что рассматриваемый файл находится не в главной цели, а только в тестовой цели. Только цель теста будет иметь эту структуру для импорта.

Аарон Зинман
источник
16
Если это поможет. Выберите цель «Не тестировать» -> Фазы сборки -> Компилировать источники. Убедитесь, что ваш «ClassTest.swift» не входит в обычную цель сборки.
Ник N
И если он входит в основной комплект и комплект для тестирования, то как удалить его из основного комплекта?
Джеймс Робинсон
1
Спасибо @NickN, вы указали точную проблему, которая у меня возникла, и это сейчас исправлено!
Найшта
Если он находится на тестовой цели, то я не могу получить доступ ни к одному из моих основных методов тестирования в моей основной цели.
UKDataGeek
спасибо, это работает как шарм. просто удаление тестовых файлов сработало.
Ccr
32

Вы только что добавили файл / класс тестов в основную цель, а не в цель теста по ошибке. Просто как тот.

Решение:

1) Удалить тестовый файл из списка «Компилировать источники» на вкладке «Фазы сборки» для основной цели

2) Добавьте тот же файл в «Источники компиляции» на вкладке «Фазы сборки» для цели теста

Это должно решить проблему

Alfishe
источник
15

Я получаю эту ошибку, если создаю цель динамического фреймворка macOS, которая ссылается на него XCTest.framework(цель - это фреймворк, а не цель тестирования!).

В этом случае проблема решается путем добавления

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks

к проекту "Build Settings / Framework Search Paths".

Станислав Панкевич
источник
Отлично! Спасибо!
Lance Kind
9
Лучше: $(PLATFORM_DIR)/Developer/Library/Frameworksв случае, если у вас установлено несколько версий Xcode под разными именами (например, версии выпуска и бета-версии).
Роб Майофф
Спасибо @robmayoff, это было правильное решение ;-)
Оливер Пирмен
Это правильный ответ при создании платформы для поддержки тестирования.
Дэниел Вуд
7

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

Если ваш проект использует CocoaPods, убедитесь, что ваша тестовая цель вложена в цель вашего основного приложения. Ваш подфайл может не включать его, если вы создали тестовую цель после запуска pod init. Ваш подфайл должен выглядеть примерно так:

target 'YourApp' do
    target 'YourAppTests' do
        inherit! :search_paths
        # Pods for testing
    end
end

Не забудьте сохранить свой подфайл и запустить pod installпосле этого.

Надеюсь, поможет!

Орландо Г Родригес
источник
5

Это может быть немного поздно, но что вам нужно сделать, это:

Нажмите Файл> Создать> Цель> Пакет модульного тестирования iOS.

А затем добавьте свои тесты там. Это сработало для меня. Проблема заключалась в том, что я не выбрал создание модульных тестов при создании проекта. Надеюсь, это кому-нибудь поможет.

Клинтон Д'Суза
источник
2

Эта проблема встречается два раза в вашем проекте.

  1. Когда вы не добавляете UnitTestingBundle в свой проект, когда создаете новый проект.
  2. При установке CocoaPods в свой проект иногда не каждый раз.

1: Ответ:

  • Перейти к файлу Нажмите на файл.

  • Затем Вы видите Первый вариант Новый Нажмите на него.

  • После того, как вы нажмете на него, вы увидите опцию Some Click нажмите на Target.

  • И тогда в панели поиска поиск IOS модульного тестирования Bundle и добавить проблему решается.

  • если компилятор не может дать вам разрешение на добавление этого, попробуйте второй метод, если указано ниже.

2. Ответьте на проблему CocoaPod:

  • Перейти к продукту Нажмите на продукт.

  • Нажмите на очистить или нажмите cmd + k.

  • Проблема решена.

Зеешан Дар
источник
2

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

Если вы уже убедились, что:

Как указано @pwc @ nick-n и другими

  1. ClassTest.swiftФайл для членства в целевой счет того , что он только прикреплен к цели тестирования.
  2. ClassTest.swiftЭто не видно под вами основные целевые приложения> Источники Строительства> Источники Компилировать

Вот что еще можно проверить:

в вашем .podspecsфайле

Убедитесь, что вы source_filesне можете прямо или косвенно включить каталог тестирования.

например :

s.source_files = ["Classes/**/*.{swift}", "Classes/**/*.{xib}"]
s.exclude_files = ["Classes/Exclude", "Classes/MyPodProjTests/"]

Обратите внимание, что Classes/**/*.{swift}включает в себя все, что отменяет тот факт, что каталог MyPodProjTestsдолжен быть исключен.

Решение:

s.source_files = ["Classes/MyPodProj/**/*.{swift}", "Classes/**/*.{xib}"]

Примечание: это крайне крайний случай и полностью человеческая ошибка, но я подумал, что это стоит отметить.

thesummersign
источник
Отличное замечание, я включил все в свой s.source_files. Спасибо!
Маурисио
1

Убедитесь, что целевое членство отмечено для всех модулей, когда выбран тестовый каркас. Вы можете просмотреть опцию Целевое членство, выбрав Вид-> Утилиты-> Показать инспектор файла

карма
источник
1

В моем случае я делал тесты для частного модуля, поэтому в podspec было что-то вроде:

s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/*.swift' end

Но в Podfile я забыл привести тестовую спецификацию как таковую:

target 'MyApp' do
use_frameworks!
pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests'] end
Хьюго Джордао
источник
0

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

Сунил Чайагол
источник
0

У меня была та же проблема, и решение для меня было:

  1. Выберите мою схему
  2. Редактировать схему ...
  3. Затем, когда откроется окно конфигурации схемы, выберите левую вкладку с именем «Тест» для перенаправления сюда: введите описание изображения здесь
  4. Как вы можете видеть, мои UITests здесь не добавляются, но существуют в моем проекте, поэтому мне нужно было просто нажать кнопку «плюс» и выбрать цель UITests следующим образом: введите описание изображения здесь
  5. Затем нажмите кнопку «Добавить» и закройте окно конфигурации.
  6. Завершите очистку проекта и повторите попытку.
  7. И не забудьте проверить это тоже: https://developer.apple.com/library/archive/qa/qa1954/_index.html

Надеюсь, этот ответ поможет.

PS: последнее, что я думаю в моей цели тестирования в настройках сборки, я должен был проверить эти свойства, которые не были настроены правильно:

DEBUG_INFORMATION_FORMAT = dwarf; 
ONLY_ACTIVE_ARCH = YES;
VALIDATE_PRODUCT = NO;
О. Бужоуан
источник
0

Так же, как @Alfishe упомянул выше:

Вы должны удалить тестовые файлы из- Compiler SourcesподBuild Phases

Как показано ниже


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

Suhaib
источник
1
Если вы сделаете это, вы не сможете выполнить тесты, насколько я знаю
Хуан Керти
0

Проверьте целевое членство в вашем тестовом классе.

Денис Кутлубаев
источник