Xcode 10.1: модули не компилируются при запуске UITest

#ios #swift #cocoapods #xcode-ui-testing #uitest

#iOS #swift #cocoapods #xcode-тестирование пользовательского интерфейса #uitest

Вопрос:

Я пытаюсь реализовать UITests в приложении, над которым я работаю.

Когда я нахожусь в своем файле UITests.swift и пытаюсь запустить приложение из теста, Xcode выдает следующую ошибку для некоторых модулей, которые я использую:

 Command CompileSwift failed with a nonzero exit code
  

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

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

Мой PodFile выглядит следующим образом:

 # Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

source 'https://github.com/cocoapods/specs.git'

project 'Project.xcodeproj'

use_frameworks!

# Define all thirdparty pods we need
def thirdparty
    pod 'Moya', '~> 11.0'
    pod 'Alamofire'
    pod 'SwiftyJSON'
    pod 'Differ'
    .. a bunch of other pods
end

# Pods for Project project
target 'Project' do
    thirdparty
end

# Pods for ProjectTests
target 'ProjectUITests' do
    thirdparty

    pod 'Nimble'
end
  

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

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

Ответ №1:

Как я могу убедиться, что все модули, которые я использую в своем проекте, также корректно компилируются при сборке из UITest?

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

 target 'ProjectUITests' do
    thirdparty
    pod 'Nimble'
end`
  

Согласно вашему Podfile, у вас есть модуль, который Nimble используется только в ProjectUITests цели. Если это единственная цель, которая заполняется для сборки, то, скорее всего, виновником является этот модуль.

За исключением одного случая (по крайней мере, насколько вы показали), в вашем Podfile не указаны версии для различных модулей, которые он указывает. Если вы не укажете версию для данного модуля, ваш проект будет использовать последнюю доступную версию. Это означает, что при каждом обновлении модулей вы будете удалять последнюю версию, даже если эта новая версия содержит критические изменения. Было бы безопаснее указать версию, которая, как вы знаете, работает, или, по крайней мере, ограничить версию второстепенной версией и исправлениями, например:

 pod 'Nimble', '~>7.0'
  

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

Комментарии:

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

2. @Joris416 Nimble — второй в списке на вашем снимке экрана — не похоже, что он работает нормально. Чтобы сузить круг задач, вы могли бы добавить другую цель, которая также включает Nimble, и посмотреть, не выйдет ли из строя и эта. Затем удалите Nimble и посмотрите, исчезнет ли проблема.

3. Извините, я должен был это видеть! Что меня озадачило, так это то, что другие модули не работают. Сейчас я пробую ваше предложение.

Ответ №2:

Проблема в том, что у target: AppModuleTests нет хоста приложения, и вы используете inherit! :search_paths. Это означает, что эта цель должна была бы найти зависимости, чтобы загрузить их с хоста, но в данном случае их нет.

целевое тестовое приложение выполняет ли pods target:AppModuleTests завершение

У меня это сработало.