Swift单元测试错误:找不到架构x86_64的符号(Swift软件包管理器)

时间:2019-01-31 06:02:01

标签: swift unit-testing linker clang swift4

我无法让单元测试在使用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)

以某种方式,似乎链接主模块失败,因此无法识别符号。但是,我无法分辨出什么问题或如何解决。

我下载了one of the sample projects from GitHub,并生成了Xcode项目。该项目的测试可以在Xcode和终端中完美运行。我已经仔细比较了示例项目和我的示例项目,无法分辨有什么不同。几乎所有设置代码(Package.swift,文件结构等)和项目设置都几乎相同。我可以告诉的唯一有意义的区别是,示例项目是一个库/框架,而我的项目是一个可执行文件(但似乎链接对于两种类型都应该工作相同)。否则,我无法说出他们在做什么,我做错了。

1 个答案:

答案 0 :(得分:0)

我知道了(感谢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"]),
    ]
)

在完整的程序是here on Github