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

Сборка юнит-теста Xcode завершилась ошибкой "Неопределенные символы для архитектуры x86_64"

Моя неудачная сборка целей завершилась с ошибкой ниже:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_MCStore", referenced from:
      objc-class-ref in MCStoreTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Основная информация:

  • Xcode6.2
  • iOS8.2 SDK

Что я проверил:

  • Symbols Hidden by Default Нет
  • Other Linker Flags is -framework XCTest
  • Framework Search Paths - $(SDKROOT)/Developer/Library/Frameworks $(унаследовано)
4b9b3361

Ответ 2

Как минимум, из целевых тестовых объектов Xcode 7.3 вы можете выбрать "Host Application". В целевой тесте тестирования (но не в настоящее время целевой тест пользовательского интерфейса) это автоматически заполняет настройку сборки "Test Host", но не "Bundle Loader", что может привести к тому, что классы не будут найдены.

Учитывая это, если вы установите для параметра "Bundle Loader" целевые значения тестовых целей значение $(TEST_HOST), оно всегда будет содержать правильное значение, даже если вы измените Host Application.

Это фактически противоположно рекомендациям, приведенным в ссылке @yuwen-yan, и должно быть меньше работы.

Ответ 3

Опытная проблема. Для меня это установило enable modules (c and objective-c) YES в целевой тесте Build Settings.

Ответ 4

Эта ошибка может быть результатом неправильного типа цели тестирования, а именно цели тестирования пользовательского интерфейса.

Цели тестирования пользовательского интерфейса не могут использовать внутреннюю часть основной цели, даже при импорте @testable. Цели модульного тестирования OTOH могут использовать внутренние органы.

Смотрите подробности в этом ответе.

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

Ответ 5

В моем конкретном случае я пытался протестировать конфигурацию release и получал эту конкретную ошибку. Поэкспериментировав с различными флагами компиляции, я обнаружил, что настройка " Enable Testability для конфигурации релиза в моих проектах (не определенных целях, но может работать тоже) сработала.

enter image description here

Ответ 6

Произошла та же ошибка компоновщика после добавления цели тестирования в старый проект, который был создан 2 или 3 версиями Xcode назад. Кроме того, проект имеет различные имена xcodeproject/target/bundle. Все возможные переименования, очистки, Build settings Build phases, манипуляции со Scheme у меня не сработали.

Что действительно сработало после долгой борьбы, так это воссоздание проекта вместе со всеми целями с нуля в последней версии XCode. Это наконец ссылки! И в этом случае вам даже не нужно вручную изменять Search paths, Bundle loader, Xcode сделает это за вас.

Ответ 7

Так вот, что сработало для меня...

override func setUp() {

    super.setUp()

    let promise = expectation(description: "App has finished running")

    DispatchQueue.global(qos: .background).async{
        // Wait on the background thread
        sleep(4)
        DispatchQueue.main.async {
            // Fullfill the promise in the main thread
            promise.fulfill()
        }
    }

    // Initialize the storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    // Get the view controller
    sut = storyboard.instantiateViewController(withIdentifier: String(describing: ViewController.self)) as? ViewController
    _ = sut.view

    waitForExpectations(timeout: 5) { (_) in
        // Finish set up after the app is done running its code
    }

}// End setUp() Method

Ответ 8

То, что работало для меня, было просто использовать цель теста на подфайле.

target 'MyAppName' do
  use_frameworks!

  pod 'SwiftLint'
  pod 'RxSwift'
  pod 'RxCocoa'
  pod 'RxDataSources'
  pod 'RxGRDB'

  target 'UnitTestTarget' do
    inherit! :search_paths  
  end
end

Ответ 9

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

базовый класс тестирования.
1. Добавьте цель тестирования в macOS.
2. Выберите окно проекта/цели. Выберите цель теста.
3. Перейдите в "фазы сборки", "связать двоичные файлы с библиотеками", добавьте среду, которую вы хотите протестировать.
4. В тестовом классе (setup/teardown) добавьте "import" в класс, который вы хотите протестировать из этого фреймворка.

Ответ 10

Ниже приведены шаги, которые я выполнил для устранения проблемы при попытке добавить unit test target в Xcode 9:

  • Перейдите в раздел "Управление схемами".
  • Нажмите кнопку "+" внизу.
  • Выберите вновь добавленную цель и выберите "ОК".
  • Убедитесь, что для вновь добавленной цели выбрана опция "Совместное использование".