如何在 Swift 包中测试 class?
How to test a class in a Swift package?
我目前正在尝试了解在 Swift 包中导入依赖项的机制,但我 运行 遇到了测试问题。希望有人能解释我做错了什么。我将逐步描述问题,以便您可以轻松地重现它。
所以我正在使用 swift package init --type executable
创建一个新的 Swift 包。此命令创建基本的 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
的简单 class 并将其放入 Sources/SwiftExample/Classes/
目录:
// Sources/SwiftExample/Classes/Car.swift
class Car {
init() {
print("I'm a car!")
}
}
在 main.swift
文件中,我可以创建 Car class 的一个实例,并且一切正常:
// Sources/SwiftExample/main.swift
print("Hello, world!")
let car = Car()
输出将是:
Hello, world!
I'm a car!
但问题是我不能在我的测试文件中使用这个class。例如,我试图在 SwiftExampleTests.swift
文件的 testExample()
函数中创建 Car
class 的实例:
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:
我肯定在这里做错了什么,但我在官方文档中找不到关于此事的任何信息。有人知道这里发生了什么以及如何解决吗?
显然,该问题在最新的 Swift 版本中不会再重现。 Car
class可以导入,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
我目前正在尝试了解在 Swift 包中导入依赖项的机制,但我 运行 遇到了测试问题。希望有人能解释我做错了什么。我将逐步描述问题,以便您可以轻松地重现它。
所以我正在使用 swift package init --type executable
创建一个新的 Swift 包。此命令创建基本的 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
的简单 class 并将其放入 Sources/SwiftExample/Classes/
目录:
// Sources/SwiftExample/Classes/Car.swift
class Car {
init() {
print("I'm a car!")
}
}
在 main.swift
文件中,我可以创建 Car class 的一个实例,并且一切正常:
// Sources/SwiftExample/main.swift
print("Hello, world!")
let car = Car()
输出将是:
Hello, world!
I'm a car!
但问题是我不能在我的测试文件中使用这个class。例如,我试图在 SwiftExampleTests.swift
文件的 testExample()
函数中创建 Car
class 的实例:
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:
我肯定在这里做错了什么,但我在官方文档中找不到关于此事的任何信息。有人知道这里发生了什么以及如何解决吗?
显然,该问题在最新的 Swift 版本中不会再重现。 Car
class可以导入,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