У меня возникают проблемы с запуском модульных тестов в проектах Swift, созданных с помощью диспетчера пакетов Swift (т. Е. Любые модульные тесты, созданные диспетчером пакетов ... те, которые я создаю из XCode, нормально работают из XCode).Я получаю ту же ошибку на всех проектах, созданных из диспетчера пакетов.Для простоты я попробовал очень простой тестовый проект с минимальным изменением настроек по умолчанию, но все равно получал ошибку.Вот шаги для воспроизведения:
- Создайте новый проект с
swift package init --type executable
(имя модуля Hello
) - Добавьте проект Xcode:
swift package generate-xcodeproj
- В настройках сборки XCode убедитесь, что Включить тестируемость - Да
- В 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, структура файла и т. Д.) И настройки проекта практически идентичны.Единственное значимое различие, которое я могу сказать, состоит в том, что пример проекта - это библиотека / фреймворк, а мой - исполняемый (но похоже, что связывание должно работать одинаково для обоих типов).В противном случае, я не могу сказать, что они делают правильно, и я делаю неправильно.