【发布时间】:2018-09-17 14:08:43
【问题描述】:
上下文
在我目前正在构建的a framework 中,我正在使用多个结构(example) 来存储字符串常量。假设一个看起来像这样:
public struct SpecificConstants {
private init() {}
public static let foo: String = "foo"
}
这一切都很好。您可以使用常量,它不会弄乱全局命名空间,结构名称说明了其中定义的常量的特定用途。
此外,通过将init() 设为私有,可以明确在框架内部(它是开源的)和在框架外部不应该实例化该结构。如果您要创建它的实例,这不会有什么坏处,但它也根本没有用。此外,如果它不是私有的,init 会显示在自动完成中,这会让我很恼火:)
问题
我很自豪地为框架编写了很多测试,并且我正在使用 Xcode 的内部覆盖率报告 (llvm cov)。不幸的是,此覆盖报告显示初始化为“未覆盖”:
这是完全合乎逻辑的,因为测试没有运行 init,因为它不可能。
令我苦恼的是,这使我无法获得良好的 100% 覆盖率。
可能的解决方案
我可以使用 lcov,这将使我能够使用
LCOV_EXCL_LINE或LCOV_EXCL_START和LCOV_EXCL_STOP将 inits 从覆盖范围中排除。
为什么不: 当 Xcode 中已经有内置工具时,我希望不必设置不同的覆盖工具。我可以让 init 在内部访问,这样我就可以在单元测试中通过将模块导入为
@testable来访问它们。
为什么不这样做:虽然它们仍然会从框架外部无法访问,它们现在在框架内可见,我不喜欢。我希望他们是私人的:D我可以忍受我的覆盖率永远不会达到 100%。
为什么不:因为我不能:)。
问题
有没有什么办法(我可以忍受它有点,甚至是很老套)在我的单元测试中运行这个被遗弃的 init,同时保持它在框架内部和外部都无法访问?
【问题讨论】:
标签: swift unit-testing code-coverage private