将目标导入到单元测试中与将该文件包含在目标成员资格中有何区别?

问题描述 投票:0回答:3

当我编写测试时,我可以这样做:

@testable import TestProduct

上述与将测试文件添加到特定目标有何不同?

最终我的问题是:如果我将我的unitTests作为我所有文件的目标...是否相当于做:

@testable import TestProduct

如果不是,那有什么区别?

swift xcode unit-testing
3个回答
22
投票

来自 Swift 文档,标题为 单元测试目标的访问级别(已添加强调)

当您编写具有单元测试目标的应用程序时,应用程序中的代码需要可供该模块使用才能进行测试。默认情况下,只有标记为开放或公共的实体才能被其他模块访问。 但是,如果您使用 @testable 属性标记产品模块的导入声明并在启用测试的情况下编译该产品模块,则单元测试目标可以访问任何内部实体。

这些文档说 @testable 属性为您的单元测试目标提供了对标记为 @testable 的模块的所有内部的访问权限。因此,您可以避免手动将该模块中的单个文件添加到单元测试目标中。


2
投票

Target 是通过在 Xcode 中运行“build”创建的最终产品。它可能 可以是应用程序、框架、静态库或单元测试包。

因此,无论您添加到特定目标的哪个文件,它都会由 xcode 构建并添加到该目标的最终产品中。

因此,为了回答您的问题,如果您将上述文件添加到测试目标中,则无需导入模块 TestProduct 即可访问测试目标中的文件,并且它将被复制到您的测试包产品目录中

当您编写以下行时,它的作用只是使您的测试目标能够访问 TestProduct 的内部文件

@testable import TestProduct

因此,如果您将该文件添加到两个目标,它将为每个目标构建两次,并且还将被复制到各自的产品目录,这实际上是不需要的浪费。


0
投票

亲爱的。 @testable import YourAppModuleName 存在于您的测试中 - 单元测试。这将向您的测试公开任何公共和默认符号。私有符号仍然不可用。这是在构建设置中。

在测试目标中创建一个新文件并将其命名为 MyFirstSpec.swift 之类的名称。 把这个内容放进去。 或者 创建框架目标。如果您不喜欢复制文件,则可以创建一个框架目标,其中包含您要测试的源文件。 另外,您可以在 github 上参考此内容以实现自动化:https://github.com/johnsundell/playground

© www.soinside.com 2019 - 2024. All rights reserved.