Ошибка компоновщика при доступе к модулю приложения в тестах пользовательского интерфейса в 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
должен просто заставить все работать, и на данный момент это не похоже. Любая помощь ценится!
Ответы
Ответ 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