Я пытаюсь написать некоторые тесты логики iOS для классов в моем проекте, которые используют функциональность некоторых библиотек в моем подспецификации. Я использую стандартный пакет модульных тестов, предоставленный в XCode (хотя не Тесты приложений, только Модульные тесты).
Например, я использую Magical Record, и у меня есть эта библиотека, связанная в моем подспецификации. Он присутствует в проекте Pods в моей рабочей области и работает, как ожидается, когда приложение работает в симуляторе или на устройстве. Однако, когда я пытаюсь связать с тестом объект, который использует Magical Record, я получаю ошибку компоновщика, утверждающую, что он не может найти селекторы из Magical Record. Я попытался обновить мой HEADER_SEARCH_PATH в моем пакете логического тестирования, даже жестко закодировать его в каталог заголовков, созданный CocoaPods, но безуспешно.
Я могу без проблем запускать модульные тесты для классов, которые не используют библиотеки CocoaPods.
Я иду по этому поводу неправильно? Должен ли я делать что-то еще, чтобы компилятор увидел библиотеки CocoaPods?
источник
isSubclassOfClass:
звонки возвращаютсяNO
туда, куда они должны вернутьсяYES
. Единственная причина, по которой я могу объяснить это, заключается в том, что зависимости действительно связаны как с основной, так и с целевой целью, и когда загрузчик пакета целевой цели загружает основной пакет, он не может решить, какой класс выбрать.isKindOfClass:
возвратом,NO
когда он должен вернутьсяYES
. Если я регистрирую указатель наClass
объект, который я тестирую, иClass
класс, который я хочу сравнить, это два разных значения. Ясно, что мой код из комплекта приложения использует другой символ для класса, чем код из моих модульных тестов. Кто-нибудь нашел способ решить эту проблему?Я понял это, посмотрев на то, как основной целью моего приложения было получение настроек из библиотеки CocoaPods. CocoaPods включает в себя файл .xcconfig с именем Pods.xcconfig. Этот файл содержит все пути поиска заголовка.
Если вы посмотрите на свой проект в навигаторе проекта и перейдете на вкладку «Информация», вы увидите конфигурации вашей сборки, перечисленные в верхнем разделе. Если вы откроете треугольник раскрытия для ваших различных конфигураций, вы увидите список стручков под вашей основной целью. Мне пришлось нажать на выпадающий список и добавить стручки к цели логического теста.
Мне также пришлось скопировать настройки
$(inherited)
и${PODS_HEADERS_SEARCH_PATHS}
из моей главной цели и скопировать их в цель логического теста в разделе Build Settings / HEADER_SEARCH_PATHS.Наконец, мне пришлось добавить libPods.a на этапе сборки Link Binary with Libraries для моей цели логических тестов.
Надеюсь, что это может помочь кому-то еще.
источник
Существует решение, которое я нашел здесь, модульные тесты с CocoaPods :
Откройте файл проекта в XCode, затем выберите Project (не цель), на правой панели есть раздел под названием Configurations. Выберите «Модули» в столбце «На основе файла конфигурации» для своей цели тестирования.
источник
Specta
, вы хотите связать с тестовым проектом, но не с основным проектом? : SClass Foo is implemented in both MyApp and MyAppTestCase. One of the two will be used. Which one is undefined.
кажется, это вызвано ошибкой в Cocoapods; см. ответ @JRV ниже.Я согласен с другими ответами о том, что необходимо связать библиотеки с целями тестирования. Однако ни одно из предложений до сих пор не помогло мне. Как пишет @fabb в комментарии: «при тестировании
isSubclassOfClass:
вызовы возвращают NO, где они должны возвращать YES. Единственная причина, по которой я могу объяснить это, заключается в том, что зависимости действительно связаны как с основной, так и с целевой целью теста, а также когда пакет цели теста Загрузчик загружает основной пакет, он не может решить, какой класс выбрать. " Я получаю ту же проблему со всеми предыдущими предложениями в этой теме.Решение, которое я получил, состояло в том, чтобы обновить мой Podfile, чтобы определить определенные Pod для моей главной цели и моей цели тестирования:
Это было необходимо , чтобы указать стручок для моей тестовой цели , даже если я не использовал никаких конкретные тесты стручков. В противном случае CocoaPods не вставит необходимую логику связывания в мой проект.
Именно эта ссылка помогла мне прийти к такому выводу.
источник
Я добавил,
:exclusive => true
чтобы избежать дублирования ошибок символов в цели теста приложения.Когда я изменил цель тестирования приложения на тестовую единицу логики, возникает ошибка компоновщика. После удаления
:exclusive => true
все снова работает.:exclusive => true
утверждает, что все, что снаружи,do...end
НЕ должно быть связаноmyProjectTests
, что разумно для целей тестирования приложения, но это вызовет ошибки компоновщика в целях логического теста.источник
Вы можете использовать link_with согласно решению @Keith Smiley.
Если у вас есть общие модули и особенности для каждой цели, вы можете использовать опцию «def» для определения группы модулей. и использовать «def» позже в исключительной цели.
В приведенном выше примере я добавил «SSKeychain» для обеих целей, а «Тайфун» только для цели «MyProject»
источник
Мое решение этой проблемы состояло в том, чтобы изменить мой Podfile, чтобы включить библиотеку в обе цели, как это
И так как я использую swift, мне также пришлось настроить цель теста для включения
MyApp-Bridging-Header.h
файла. (В группе Swift Compiler на вкладке «Настройки сборки»)источник
Pods
проекта. Упоминая свои стручки дважды (один раз для тестирования и один раз для приложения), вы получите два набора целей. Это эффективно удваивает конфигурацию работыpod install
. Это не будет проблемой, пока у вас не будет> 15 стручков, так что не волнуйтесь до тех пор.У меня был похожий случай, когда я потерял некоторые библиотечные файлы во время контроля версий. Я все еще видел библиотечный файл в моих модулях, но при отсутствии действующего кода XCode сказал, что его больше нет. К моему ужасу, запуск 'pod install' не сразу возвращал потерянные файлы.
Мне пришлось удалить и заменить модуль вручную, выполнив следующие действия:
Это должно вернуть библиотеку в ее первоначальный вид.
источник
Также стоит отметить, что если вы
libPods.a
добавили дважды, вы получите некую неприятную ошибку, подобную этой:Чтобы исправить это, просто удалите одну из
libPods.a
ссылок в Project Explorer.источник
В CocoaPods 1.x появился новый способ объявления общих зависимостей между целью и соответствующей целью теста. До этого момента я использовал общепринятое решение Марка Струзинского, но использование этого метода дало огромное количество предупреждений при выполнении моих тестов, которые:
С CocoaPods 1.x мы можем объявить нашу цель -Test как наследующую через пути поиска родительской цели следующим образом:
Это приведет к тому, что цель -Test получит доступ к зависимостям цели приложения без нескольких двоичных копий. Это серьезно ускорило время сборки тестов для меня.
источник
Попробуйте это у меня работает,
Нам нужно установить блоки в конфигурациях,
Проект-> Информация-> Конфигурации в проекте XCode (ваш проект) должен быть установлен в основной проект 'Pods' для Отладки, Выпуска (и что еще у вас есть). Смотрите "Заголовки не найдены - пути поиска не включены"
Надеюсь, это поможет кому-то.
источник
Я работаю с интеграцией POD GoogleMaps Objective-C на iOS с моим приложением Swift, и поэтому для меня проблема заключалась в том, что цель теста не имела ссылки на файл заголовка моста ( SWIFT_OBJC_BRIDGING_HEADER ) в настройках сборки. Убедитесь, что как ваше приложение, так и цели тестового приложения указывают на это, чтобы сторонние вызовы API (API карт и т. Д.) Могли использоваться в быстрых модульных тестах.
источник
import GoogleMaps
.Следующий синтаксис дает лучший результат для меня (протестировано под cocoapod v.1.2.1):
https://github.com/CocoaPods/CocoaPods/issues/4626#issuecomment-210402349
Без этого у меня есть предупреждения во время теста о дубликатах символов.
После этого предупреждения исчезли.
источник
У меня были проблемы с использованием OpenCV под XCTest. Это давало мне ошибки компоновщика
Undefined symbols for architecture arm64
для таких классов, какcv::Mat
. Я устанавливаю OpenCV через CocoaPods используяpod 'OpenCV', '~> 2.0'
основную цель. Независимо от того, как сильно я пытался поместить зависимость OpenCV под цель тестирования или использоватьinherit! :search_paths
ничего из этого не получалось. Решение было создатьabstract_target
так:Также полезны команды
pod deintegrate
&,pod clean
которые помогают очистить проект и убедиться, что вы начинаете заново при тестировании. Вы можете установить эти два, используя[sudo] gem install cocoapods-deintegrate cocoapods-clean
.источник