Ошибка тестирования модуля Swift: символ (ы) не найден для архитектуры x86_64 (диспетчер пакетов Swift) - PullRequest
0 голосов
/ 31 января 2019

У меня возникают проблемы с запуском модульных тестов в проектах Swift, созданных с помощью диспетчера пакетов Swift (т. Е. Любые модульные тесты, созданные диспетчером пакетов ... те, которые я создаю из XCode, нормально работают из XCode).Я получаю ту же ошибку на всех проектах, созданных из диспетчера пакетов.Для простоты я попробовал очень простой тестовый проект с минимальным изменением настроек по умолчанию, но все равно получал ошибку.Вот шаги для воспроизведения:

  1. Создайте новый проект с swift package init --type executable (имя модуля Hello)
  2. Добавьте проект Xcode: swift package generate-xcodeproj
  3. В настройках сборки XCode убедитесь, что Включить тестируемость - Да
  4. В swift.main введите этот простой тестовый код:
import Foundation

let message = "Hello, world!"
print(message)
В HelloTests.swift:
import XCTest
@testable import Hello

class HelloTests: XCTestCase {
    func testExample() {
        XCTAssert(message == "Hello, world!")
    }

    static var allTests = [
        ("testExample", testExample),
    ]
}
Package.swift и XCTestManifests.swift оставлены как есть. Он собирается и прекрасно работает с swift build и swift run Hello (также изнутри в Xcode). Однакопри выполнении swift test или выполнении любого теста в XCode сборка завершается неудачно со следующим сообщением об ошибке:
Undefined symbols for architecture x86_64:
  "Hello.message.unsafeMutableAddressor : Swift.String", referenced from:
      implicit closure #1 : @autoclosure () throws -> Swift.Bool in HelloTests.HelloTests.testExample() -> () in HelloTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Почему-то кажется, что не удается связать основной модуль, поэтому символыне признаютсяОднако я не могу сказать, что не так или как это исправить.

Я скачал один из примеров проектов из GitHub и сгенерировал проект Xcode.Тесты для этого проекта отлично работают в Xcode и терминале.Я тщательно сравнил пример проекта с моим и не могу сказать, что отличается.Почти весь код установки (Package.swift, структура файла и т. Д.) И настройки проекта практически идентичны.Единственное значимое различие, которое я могу сказать, состоит в том, что пример проекта - это библиотека / фреймворк, а мой - исполняемый (но похоже, что связывание должно работать одинаково для обоих типов).В противном случае, я не могу сказать, что они делают правильно, и я делаю неправильно.

1 Ответ

0 голосов
/ 02 февраля 2019

Я разобрался (благодаря помощи Cristik ).Исполняемые модули не являются тестируемыми (по крайней мере, на данный момент), поэтому решение состояло в том, чтобы переместить все определения в библиотечный модуль и оставить только исполняемый файл main.swift в исполняемом модуле.Таким образом, все модульные тесты запускались с библиотекой как зависимость от исполняемого файла.Package.swift теперь выглядит так:

let package = Package(
    name: "HighestNumberPairing",
    products: [
        .executable(name: "HighestNumberPairing", targets: ["HighestNumberPairing"]),
        .library(name: "NumberPairing", targets: ["NumberPairing"]),
    ],
    dependencies: [],
    targets: [
        .target(
            name: "HighestNumberPairing",
            dependencies: ["NumberPairing"]),
        .target(
            name: "NumberPairing",
            dependencies: []),
        .testTarget(
            name: "NumberPairingTests",
            dependencies: ["NumberPairing"]),
    ]
)

Полная программа здесь, на Github .

...