Swift 运行 测试没有主机应用程序时包构建失败

Swift package build failure when running tests without host application

我的 Swift macOS 项目正在通过 Swift 包管理器使用 Swift-Collections 包(Xcode 13.1,Swift-Collections 1.0. 2).

当我的单元测试目标的主机应用程序设置为 None 时,测试构建失败并出现几个 Undefined symbol 形式的错误:

Undefined symbol: OrderedCollections.OrderedSet.append(A) -> (inserted: Swift.Bool, index: Swift.Int)

当没有主机应用程序时,swift-collections 包文件似乎没有添加到测试目标,而且我看不到任何添加它们的方法。如果有人能告诉我这是否可以通过编辑 Package.swift 文件或类似文件来解决,那就太好了。

顺便说一句,在没有主机应用程序的情况下进行 运行 单元测试的动机是这样一个事实,即在启动应用程序时执行的代码被计入代码覆盖率报告中,这大大偏向了覆盖率。如果有一种我没有注意到的方法来阻止或过滤它(不更改源代码),那也可以解决我的问题。

编辑:在新建测试项目时也会出现这种情况:create new macOS project;通过文件 -> 添加包添加 Swift-Collections 的 OrderedCollections 包;添加简单的结构导入和使用 OrderedCollections,例如:

import Foundation
import OrderedCollections
struct Wut {
   static func thing() {
      let whatever = OrderedSet<Int>()
   }
}

在单元测试目标的 'General' 选项卡中将主机应用程序设置为 None,点击 cmd-U,构建失败: Undefined symbol: OrderedCollections.OrderedSet.init() -> OrderedCollections.OrderedSet<A>

错误告诉您 Linker 无法解析 OrderedCollections 包的符号。当它是 运行 时,测试包被注入到主机应用程序中,它可以在主机应用程序中查找这些符号。当它 运行 没有主机应用程序时,您必须将链接器指向包含符号的库。

修复:

  • 将 swift-collections 包中的 OrderedCollections 库添加为测试目标“构建阶段”的“依赖项”构建阶段部分中的依赖项。
  • 将 swift-collections 包中的 OrderedCollections 库添加到测试目标的“Build Phases”窗格的“Link Binary With Libraries”部分。

两个列表下方的加号图标是您添加库的方式。这里: