在 Swift 中构造 CLI 应用程序的好方法或常用方法是什么

What is a good or common way to structure a CLI appliction in Swift

我正在学习Swift5,写一些习题有什么更好的方法。但这让我有点头疼。这就是我想要做的。

我想编写一个简单的 CLI 应用程序,但我还想包括单元测试。假设该应用名为 simple_app

所以我继续,打开 XCode v12.4 并单击“新建项目”。我选择使用 Swift 语言的 MacOS 控制台应用程序。这给了我一个名为 simple_app 的文件夹,其中包含一个 .xcodeproj 和另一个名为 simple_app 的文件夹。在第二个文件夹中是实际的源代码。

似乎 Swift 项目使用约定来查找 main.swift 文件作为入口点。到目前为止,一切都很好。现在假设我有这么简单的东西:

func add(_ numA:Int, _ numB:Int) -> Int {
    return numA + numB
}

func main() {
    print(add(4, 5))
}

main()

这按预期工作。 所以现在,我想添加单元测试。经过一些阅读后,我似乎需要添加一个新的 target.I,然后使用 Xcode 创建一个新目标,我将其命名为 simple_app_tests。这创建了一些不错的模板。但是当我尝试导入 simple_app mmm 目标时?包裹? (不知道现在是什么)它不会再编译了。

进一步阅读后我发现我无法 link 一个 main.swift 文件到测试目标。那种是有道理的。它将有 2 个入口点:用于测试的入口点和我的主文件。 所以多读书。这就是我有点卡住的地方。 看来我需要将我的应用程序拆分为一个独立于主要可执行文件的 library/package,然后是另一个包含 main.swift 文件的工件。通过 Xcode 添加包创建另一个具有自己测试的目标。所以我最终得到了 3 个工件(不确定它们到底是什么):simple_appsimple_app_testssimple_app_package,其中还包含更多目标……这就是事情变得太过分的地方对于这样一个简单的应用程序来说很复杂。

大多数 tutorials/books 和 Whosebug 问题与 IOS 开发更相关,并且出于某种原因这些解决方案不适用于我的情况或者我不清楚。我一直收到 linking 错误,或者我最终得到一个如此简单的应用程序的臃肿项目。

所以我的问题是。有没有一种方法可以构建 simple_app 以便我能够编写测试和功能而不会使 y 项目的结构过于复杂?

注意:我知道有时可以将您的代码拆分为库和可执行文件(Rust 需要这种拆分)以便能够编译和 运行 测试。只需要一些关于如何在 swift 上正确完成的指导。 谢谢。

您不能对命令行工具主文件进行单元测试,因为它不是可测试的目标。

但是你可以测试一个框架。所以做一个框架目标,做一个伴随的单元测试目标,把你的可测试代码放到框架中。

但是,命令行工具不能包含框架;它只是源文件。因此,框架的源文件也需要包含在命令行工具目标中。您没有将框架嵌入或 link 到命令行工具中;那行不通。

因此,命令行工具并不将框架视为一个框架,而是将其视为与其自身相同的“模块”的一部分。同时,测试目标将框架视为它正在测试的对象。一切都很好。

我应该提一下,这也是构建 GUI iOS 应用程序单元测试的好方法,因为测试不需要在模拟器中加载应用程序和 运行 .

有关进一步讨论,请参阅 https://developer.apple.com/forums/thread/52211