Подтвердить что ты не робот

Как должен быть настроен проект Swift + Objective-C для модульного тестирования

Мне очень сложно узнать, как настроить тестовые объекты в Xcode 6b4. Может кто-то указать мне в правильном направлении, учитывая этот сценарий.

У меня есть проект Swift в основном. Тем не менее, есть некоторые сторонние Objective-C зависимости, которые попадают в заголовок приложения. Я хочу написать тесты для моего кода Swift. В идеале, в Свифт. Проблема у меня в этом....

  • Если я создаю тестовый пример Swift, компилятор жалуется, что он не может найти заголовки Objective-C в заголовке моста приложения.

  • Если я создаю тестовый пример Objective-C, то я не могу импортировать классы Swift, которые я хочу проверить.

Единственное, что я могу сделать, это написать Objective-C тесты, которые не касаются Swift. Я не могу написать "чисто Swift-код/​​тесты" из-за зависимостей Objective-C.

Есть ли у кого-нибудь какие-либо советы или успех в этом. Или это текущее состояние вещей в Beta 4?

4b9b3361

Ответ 1

Я не уверен, что вы по-прежнему ищете это, поскольку Xcode 6 больше не находится в бета-версии, но вы можете добавить свой файл заголовка моста Objective-C к цели модульного теста в настройках цели. Это решило проблему для меня.

Objective-C Bridging Header Xcode settings

Ответ 2

Из Xcode 6 Beta 4 примечания к выпуску известные проблемы:

Тестирование

• Ед. тесты, написанные в Objective-C, не могут импортировать Swift ( "$ (PRODUCT_MODULE_NAME) -Swift.h" ) для цели приложения и, следовательно, не могут использоваться для проверки кода, который требуется этот заголовок. (16931027)

• Обход проблемы: модульные тесты для Swift код должен быть написан в Swift. Модульные тесты, написанные в Objective-Cдля целей инфраструктуры можно получить доступ к связанным с Swift интерфейсам импортирование модуля фреймворка с помощью '@import FrameworkName;.

Итак, вы не можете проверить код Swift в Objective-C.

Также из примечаний к выпуску:

Ограничение системы контроля доступа заключается в том, что модульные тесты не могут взаимодействовать с классами и методами в приложении, если они не публикуются. Это связано с тем, что цель unit test не является частью модуль приложения.

Крис Лэттнер заявил на этот пост на форумах разработчиков, что они все еще оценивают ситуацию, чтобы увидеть, как они могут проводить тесты на унифицированных модулях и недавно реализованные средства контроля доступа.

Итак, я ожидал бы многих изменений в модульном тестировании как в Swift сам по себе, так и в проектах, которые используют Swift и Objective-C.

Ответ 3

Мы сделали это, я видел все возможные ошибки на этом пути: ошибки имени модуля при получении VC из раскадровки, ошибки MyType_MyType_, специфичные для сущностей coredata, и так далее, но это было самым худшим.

Фокус в том, чтобы использовать файл -Swift.h из целевого объекта сборки, а не цели тестирования, потому что в целевых точках тестирования иногда нужно включать файлы objc, но не быстрые файлы, и objc не узнает их, если они связаны друг с другом, но в цели сборки все есть.

  • Прежде всего убедитесь, что цель -Swift.h целевого теста не названа так же, как цель сборки.

  • Включить в тесты .pch или в каждом отдельном файле -Swift из целевой отладки.

  • Пусть компилятор знает, где находится этот файл (в исходных источниках), редактируя пути поиска заголовка пользователя с помощью: $(OBJROOT)/MyProjectName.build/Debug-iphonesimulator/MyProjectTarget.build/DerivedSources. Если не уверен, inFinder и найти имена. Если в именах есть пробелы, вам нужно добавить \before space

  • Подробнее о переменных проекта вы можете найти здесь: Как распечатать список "Параметры сборки" и "Создать настройки" . в проекте Xcode?

  • Всегда искать Пути пользователя должны быть установлены в YES

  • Не включайте быстрые файлы в цель тестирования, но используйте @testable

Я надеюсь, что Apple исправит это в следующем xcode.

Ответ 4

Я сделал работу, обновив "Objective-c сгенерированное имя заголовка интерфейса" до "YourApplication-Swift.h"

По умолчанию для этого нужно создать TargetName-Swift.h, компилятор никогда не генерирует YourApplicaitonTest-Swift.h

Ответ 5

Я столкнулся с этим вопросом, пытаясь понять, как получить доступ к моему проекту Swift из моих тестов Swift. Как мой проект, так и тесты были первоначально запущены в Objective-C, поэтому у них есть все настройки заголовков мостов.

Чтобы получить доступ к классам Swift из моего проекта, мне пришлось добавить:

@testable import MyProjectName

В верхней части моего тестового файла Swift. После его создания для тестов Xcode распознал мой быстрый код.

Я надеюсь, что это поможет кому-то другому.

Ответ 6

У меня была эта проблема и я попытался ее решить в настройках сборки для тестовой цели. Изменяя пути поиска, импортируя swift-заголовок, импортируя вещи в заголовок моста. Однако он оказался в моем подкиде. Я должен был добавить link_with с тестовой целью. Вот так:

platform :ios, '8.0'
link_with 'YourApp', 'YourAppTests'
pod 'ThePopularPod', '1.2.3', :inhibit_warnings => true

Ответ 7

Попробуйте поместить операторы #import "xyz-Swift.h" в свои предварительно скомпилированные файлы заголовков. Таким образом, у вас есть разные операторы импорта для всех заголовков Obj-C, в зависимости от цели:

MyProject-Prefix.pch(цель приложения):

#import "MyProject-Swift.h"

MyProjectTests-Prefix.pch(цель теста):

#import "MyProjectTests-Swift.h" 

Ответ 8

Чтобы Xcode 10 включил классы swift в ваш тест Obj-C, вам нужно добавить автоматически сгенерированный заголовок Module-Swift.h в путь поиска пользователя вашей цели теста.

Перейдите к цели тестирования> Настройки сборки> Пути поиска в заголовке и добавьте $ CONFIGURATION_TEMP_DIR/YourProject.build/DerivedSources в нем

Для дополнительной информации смотрите iOS тесты, работающие с Objective-C и Swift классом вместе