Swift单元测试错误:找不到体系结构x86_64(Swift Package Manager)的符号



我在用Swift Package Manager创建的Swift项目中运行单元测试时遇到了问题(也就是说,由Package Manager创建任何单元测试……我从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)
  1. 在HelloTests.swift中:
import XCTest
@testable import Hello
class HelloTests: XCTestCase {
func testExample() {
XCTAssert(message == "Hello, world!")
}
static var allTests = [
("testExample", testExample),
]
}
  1. Package.swift和XCTestManifests.swift保持原样
  2. 它与swift buildswift run Hello一起构建和运行良好(此外,从Xcode中的内部)
  3. 但是,当运行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、文件结构等)和项目设置都几乎相同。我能说的唯一有意义的区别是,示例项目是一个库/框架,而我的是一个可执行文件(但链接似乎对这两种类型都一样)。否则,我无法判断他们做得对什么,我做得错。

我想明白了(多亏了Cristik的帮助)。可执行模块是不可测试的(至少目前是这样),因此解决方案是将所有定义移动到库模块,并在可执行模块中只保留main.swift文件。这样,所有的单元测试都是以库作为依赖项而不是可执行文件来运行的。软件包.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上。

最新更新