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

Ошибка компоновщика при доступе к модулю приложения в тестах пользовательского интерфейса в XCode 7.1

Я пытаюсь реализовать некоторые тесты ui в моем проекте. Все идет хорошо, пока я держу это просто: запишите тестовый пример, добавьте несколько утверждений, затем запустите тест. Это прекрасно работает, однако, когда я пытаюсь получить доступ к модулю приложения из моего теста, компоновщик выдает ошибку (см. Ниже):

В исходном файле приложения:

func foo() {
   assert(true)
}

В тестах пользовательского интерфейса:

import XCTest
@testable import MyApp

func testExample() {
    foo()
}

Ошибка:

Undefined символы для архитектуры i386: "MyApp.foo() → ()", ссылка:       MyAppUITests.MyAppUITests.testExample(MyAppUITests.MyAppUITests)() → () в MyAppUITests.o ld: Символ не найден для архитектуры i386 clang: error: linker command не удалось с кодом выхода 1 (используйте -v, чтобы увидеть вызов)

Undefined символы для архитектуры x86_64: "MyApp.foo() → ()", ссылка:       MyAppUITests.MyAppUITests.testExample(MyAppUITests.MyAppUITests)() → () в MyAppUITests.o ld: символ (ы), не найденный для архитектуры x86_64

Я слышал подобную проблему, описанную здесь: https://forums.developer.apple.com/thread/20609 но никакого решения. Мне кажется, что @testable просто работает неправильно. Парень на developer.apple.com попытался обходным путем, добавив тестовый хост и загрузчик пакетов в настройки, но я не думаю, что это правильный подход. Я думаю, что @testable должен просто заставить все работать, и на данный момент это не похоже. Любая помощь ценится!

4b9b3361

Ответ 1

@testable import MainModule не будет работать для теста UI, хотя это позволит завершить работу кода (может заставить вас почувствовать, что он работает). Он предназначен только для unit test. И это приведет к сбою сборки, что-то вроде:

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Обходной путь заключается в том, чтобы добавить файл исходного кода в целевой тестовый объект UI, тогда он будет работать из коробки (даже без @testable import).

Инспектор файлов Целевое членство → проверить целевую аудиторию пользовательского интерфейса (в дополнение к основной цели)

Надежда Apple скоро исправит это, чтобы мы могли использовать более чистый способ.

Ответ 2

Тесты пользовательского интерфейса представляют собой отдельный модуль из приложения, поэтому не выполняются внутри вашего приложения в качестве логического теста. Единственный способ совместного использования кода - собрать все файлы приложений, которые необходимо разделить между двумя модулями. Проверьте этот блог, как вы можете это достичь, https://www.bignerdranch.com/blog/ui-testing-in-xcode-7-part-1-ui-testing-gotchas/

Также найден радар, зарегистрированный здесь, https://openradar.appspot.com/23116258

Ответ 3

@testable import действительно может вызвать эту ошибку. Просто вытащите линию. Это не нужно для UITests.

Обратите внимание, что в течение 6 минут разработчик Apple не использует @testable. https://www.youtube.com/watch?v=7zMGf-0OnoU&t=1316s