上下文
在 a framework我目前正在构建,我正在使用多个结构 (example)存储字符串常量。假设一个看起来像这样:
public struct SpecificConstants {
private init() {}
public static let foo: String = "foo"
}
这一切都很好。您可以使用常量,它不会困惑全局命名空间,结构名称说明了其中定义的常量的特定用途。
此外,通过将 init()
设为私有(private),可以清楚地表明框架内部(它是开源的)和框架外部不应实例化该结构。如果您要创建它的实例,这不会有什么坏处,但它也根本没有用处。另外,如果 init 不是私有(private)的,它会显示在自动完成中,这会让我烦恼:)
问题
我很自豪地为该框架编写了大量测试,并且正在使用 Xcode 的内部覆盖率报告 (llvm cov)。不幸的是,此覆盖率报告将 init 显示为“未覆盖”:
这是完全合乎逻辑的,因为 init 没有由测试运行,因为它不可能。
令我苦恼的是,这使我无法获得 100% 的良好覆盖率。
可能的解决方案
我可以使用lcov ,这将使我能够使用
LCOV_EXCL_LINE
或LCOV_EXCL_START
和LCOV_EXCL_STOP
将 inits 从覆盖范围中排除。
为什么不:当 Xcode 中已有内置工具时,我希望不必设置不同的覆盖工具。我可以使 inits 在内部可访问,这样我就可以通过将模块导入为
@testable
来在单元测试中访问它们。
为什么不:虽然它们仍然无法从框架外部访问,但它们现在在框架内部可见,这是我不喜欢的。我希望它们是私密的:D我可以接受我的覆盖率永远不会达到 100%。
为什么不:因为我就是做不到:)。
问题
有没有什么办法(我可以忍受它有点,甚至很老套)在我的单元测试中运行这个被遗弃的 init,同时保持它从框架外部和内部都无法访问?
最佳答案
将字符串常量移至枚举,然后就不需要私有(private)初始化。
enum SpecificConstants {
static let foo = "foo"
}
关于swift - 如何覆盖私有(private) init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711552/