Как проверить класс в пакете Swift?
В настоящее время я пытаюсь понять механизм импорта зависимостей в пакет Swift, и я столкнулся с проблемой с тестами. Надеюсь, кто-то может объяснить, что я делаю не так. Я собираюсь описать проблему шаг за шагом, чтобы вы могли легко воспроизвести ее.
Итак, я создаю новый пакет Swift, используя swift package init --type executable
, Эта команда создает базовую структуру пакета Swift:
Artems-MacBook-Pro:SwiftExample artem$ swift package init --type executable
Creating executable package: SwiftExample
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/SwiftExample/main.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/SwiftExampleTests/
Creating Tests/SwiftExampleTests/SwiftExampleTests.swift
Creating Tests/SwiftExampleTests/XCTestManifests.swift
Сам пакет называется SwiftExample
, Как вы видите, команда также создает пример тестового случая (SwiftExampleTests.swift
).
Затем я создаю простой класс с именем Car.swift
и положить его в Sources/SwiftExample/Classes/
каталог:
// Sources/SwiftExample/Classes/Car.swift
class Car {
init() {
print("I'm a car!")
}
}
в main.swift
Файл, который я могу создать экземпляр класса Car, и все работает довольно хорошо:
// Sources/SwiftExample/main.swift
print("Hello, world!")
let car = Car()
Выход будет:
Hello, world!
I'm a car!
Но проблема в том, что я не могу использовать этот класс в моем тестовом файле. Например, я пытаюсь создать экземпляр Car
класс в testExample()
функция SwiftExampleTests.swift
файл:
import XCTest
import class Foundation.Bundle
@testable import SwiftExample
final class SwiftExampleTests: XCTestCase {
func testExample() throws {
let car = Car()
<other code goes here>
}
<other code goes here>
}
Как вы можете видеть, я импортировал сам модуль, используя ключевое слово @testable
, Но когда я бегу swift test
Команда Я получаю эту странную ошибку:
Compile Swift Module 'SwiftExample' (2 sources)
Compile Swift Module 'SwiftExampleTests' (2 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/SwiftExample
/Users/artem/Playgrounds/SwiftExample/Tests/SwiftExampleTests/SwiftExampleTests.swift:9:13: warning: initialization of immutable value 'car' was never used; consider replacing with assignment to '_' or removing it
let car = Car()
~~~~^~~
_
Linking ./.build/x86_64-apple-macosx10.10/debug/SwiftExamplePackageTests.xctest/Contents/MacOS/SwiftExamplePackageTests
Undefined symbols for architecture x86_64:
"_$S12SwiftExample3CarCACycfC", referenced from:
_$S17SwiftExampleTestsAAC04testB0yyKF in SwiftExampleTests.swift.o
"_$S12SwiftExample3CarCMa", referenced from:
_$S17SwiftExampleTestsAAC04testB0yyKF in SwiftExampleTests.swift.o
ld: symbol(s) not found for architecture x86_64
<unknown>:0: error: link command failed with exit code 1 (use -v to see invocation)
error: terminated(1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /Users/artem/Playgrounds/SwiftExample/.build/debug.yaml test output:
Я, конечно, что-то делаю не так, но не могу найти никакой информации по этому вопросу в официальных документах. Кто-нибудь знает, что здесь происходит и как это исправить?
1 ответ
Судя по всему, проблема больше не будет воспроизводиться в последней версии Swift. В
Car
класс можно импортировать и
swift test
команда не подведет.
Для справки, мой текущий
swift --version
вывод:
swift-driver version: 1.45.2 Apple Swift version 5.6.1 (swiftlang-5.6.0.323.66 clang-1316.0.20.12)
Target: arm64-apple-macosx12.0