如何获得 private init 的覆盖

How to get coverage for private init

上下文

a framework I'm currently building, I am using multiple structs (example)中存放String常量。假设一个看起来像这样:

public struct SpecificConstants {
    private init() {}
    public static let foo: String = "foo"
}

一切都很好。您可以使用常量,它不会弄乱全局命名空间,结构名称说明其中定义的常量的特定用途。

此外,通过将 init() 设为私有,在框架内部(它是开源的)和框架外部都清楚地表明不应实例化此结构。如果您要创建它的一个实例,那不会有什么坏处,但它也根本没有用。此外,如果 init 不是私有的,它会出现在自动完成中,这会让我很烦:)

问题

我很自豪地为框架编写了很多测试,并且我正在使用 Xcode 的内部覆盖率报告 (llvm cov)。不幸的是,此覆盖率报告将 init 显示为 'not covered':

这是完全合乎逻辑的,因为 init 没有被测试运行,因为它不可能。
令我苦恼的是,这使我无法获得 100% 的良好覆盖率。

可能的解决方案

  1. 我可以使用 lcov,这将使我能够使用 LCOV_EXCL_LINELCOV_EXCL_STARTLCOV_EXCL_STOP 从覆盖范围中排除初始化。
    为什么不呢: 当 Xcode.

  2. 中已经有一个内置工具时,我希望不必设置不同的覆盖工具
  3. 我可以使 init 可以在内部访问,这样我就可以通过将模块导入为 @testable.
    在我的单元测试中访问它们 为什么不: 虽然它们仍然无法从框架外部访问,但现在它们在框架内是可见的,我不喜欢这样。我希望他们是私人的 :D

  4. 我可以忍受我的覆盖率从未达到 100%。
    为什么不呢:因为我做不到:).

问题

有没有什么办法(我可以忍受它有点,甚至很老套)运行 这个在我的单元测试中被遗弃的初始化,同时保持它从外部和框架内部都无法访问?

将您的字符串常量移动到一个枚举中,那么您将不需要私有初始化。

enum SpecificConstants {
    static let foo = "foo"
}