Сбой тестирования платформы macOS Swift


У меня есть фреймворк, написанный на obj-c и swift.

Теперь я пытаюсь запустить связанную цель модульного теста, но получаю следующую ошибку:

2014-07-10 07:45:54.064 xctest[4908:303] The test bundle at /Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest could not be loaded because an unanticipated error occurred: Error Domain=NSCocoaErrorDomain Code=3587 "The bundle “SOGraphDB-Mac Tests” couldn’t be loaded because it is damaged or missing necessary resources." (dlopen_preflight(/Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest/Contents/MacOS/SOGraphDB-Mac Tests): Library not loaded: @rpath/libswiftAppKit.dylib
  Referenced from: /Users/steve/Temporary/Build/Products/Debug/SOGraphDB.framework/Versions/A/SOGraphDB
  Reason: image not found) UserInfo=0x10011c640 {NSLocalizedFailureReason=The bundle is damaged or missing necessary resources., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSFilePath=/Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest/Contents/MacOS/SOGraphDB-Mac Tests, NSDebugDescription=dlopen_preflight(/Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest/Contents/MacOS/SOGraphDB-Mac Tests): Library not loaded: @rpath/libswiftAppKit.dylib
  Referenced from: /Users/steve/Temporary/Build/Products/Debug/SOGraphDB.framework/Versions/A/SOGraphDB
  Reason: image not found, NSBundlePath=/Users/steve/Temporary/Build/Products/Debug/SOGraphDB-Mac Tests.xctest, NSLocalizedDescription=The bundle “SOGraphDB-Mac Tests” couldn’t be loaded because it is damaged or missing necessary resources.}
Есть идеи, какова может быть первопричина? Ошибка, по-видимому, связана с "библиотека не загружена: @rpath/libswiftAppKit.dylib "

Оба (фреймворк и тестовый пакет) компилируются без каких-либо ошибок или предупреждений (в Beta2)

6 8

6 ответов:

У меня была та же проблема.

В итоге скопировал libswiftAppKit.dylib из каталога приложений Xcode (я использую beta 3), в каталог, на который я мог бы ссылаться (не часть пакета приложений), а затем добавить библиотеку в параметр "связать двоичный файл с библиотеками" для тестового пакета. Затем мои тесты начали работать.

К вашему сведению, путь для dylib был на '/Приложения / Xcode6-Beta3.app / Contents / Developer/Toolchains / XcodeDefault.xctoolchain / usr / lib / swift/macosx / libswiftAppKit.dylib '

Вероятно, не очень хорошее окончательное решение, но оно работает для промежуточного периода.

У меня была аналогичная проблема, хотя мой тестовый объект iOS, связанный с платформой Swift, не смог работать на Xcode 6 GM. Тестовый объект был успешно запущен на ранней бета-версии Xcode 6, но окончательная версия сообщила об ошибке выполнения: Library not loaded: @rpath/libswiftCore.dylib

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

  1. Тестовой цели требуется " встроенный целевой объект содержит Swift-код " установка на да. Это указывает компоновщику, чтобы добавить SWIFT среды выполнения библиотек в исполняемый файл.

  2. Тестовой цели требуется явное значение для параметра построения "Runpath Search Paths". Это указывает загрузчику, где найти библиотеки среды выполнения Swift. Я скопировал следующую настройку из новой тестовой цели:

    LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks
    
  3. Тестовые случаи должны явно импортировать все модули, используемые связанной платформой. В моем проекте используется фреймворк UIKit, но тестовые случаи использовали только мой фреймворк. Когда я добавил явный import UIKit к тестовым случаям, проблема связи исчезла.

Поскольку я постоянно сталкиваюсь с этой проблемой всякий раз, когда я путаюсь с настройками сборки, вот самый чистый ответ, который я могу предоставить по состоянию на Xcode 8b5:

Если модульные тесты не выполняются на iOS , Убедитесь, что у вас есть:

Runpath Поиск Путей: @loader_path/Frameworks

Если модульные тесты не выполняются на macOS , Убедитесь, что у вас есть:

Runpath Поиск Путей: @loader_path/../Frameworks

Как LD_RUNPATH_SEARCH_PATHS в pbxproj файл. Вы также можете добавить $(inherited) чтобы убедиться, что пути для всего проекта также добавлены, но они, вероятно, пусты.

Наконец, мне не нужны настройки executable_path/..., для меня не имеет значения, существуют они или нет для модульных тестов.

Мое решение состояло в том, чтобы добавить один файл к моей тестовой цели, AppKitTests.swift (или AppKitSpec.swift в моем случае), и все, что содержит файл:

// While I don't know why, The.framework is built linked to libswiftAppKit.
// Frameworks do not embed the Swift libraries themselves, it's up to the host
// app to include the necessary libraries. So here we are, including AppKit on
// behalf of The.framework so that the tests can run.
import AppKit

О, я также добавил AppKit в набор фреймворков тестовой цели.

Это пришло мне в голову в бета-4, и оказалось, что я сделал это с собой, не осознавая этого.

У меня был рамочный проект под названием Fnord. Моя цель FnordTests содержала несколько классов модульных тестов, которые имели import Fnord в верхней части каждого файла. По какой-то причине Xcode жаловался на этот импорт, и поэтому я прокомментировал их. Именно тогда я начал получать те же симптомы при попытке выполнить мои модульные тесты.

Я заметил, что настройки для моих тестов FnordTests цель была такова, что цель была бы связана с Fnord.framework, и я понял, что она не могла бы сделать это с вышеупомянутыми import Fnord утверждениями diked-out.

Поэтому я положил их обратно, и все вернулось в норму. Любопытно, что Xcode больше не показывал эти операторы импорта как проблемные, но это бета-версия, поэтому я могу простить это. Я надеюсь, что это кому-то поможет.

Я столкнулся с той же проблемой, добавив

import AppKit

В файле Swift исправлено