如何获得私有初始

时间:2018-04-07 20:11:35

标签: swift unit-testing code-coverage private

上下文

在我正在构建的a framework中,我使用多个结构(example)来存储String常量。让我们说一个看起来像这样:

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

这一切都很好。您可以使用常量,它不会使全局命名空间混乱,结构名称表示在其中定义的常量的特定目的。

此外,通过使init()私有,它在框架(它的开源)内部变得清晰,并且在它之外,不应该实例化该结构。如果您要创建它的实例,它也不会受到伤害,但它根本没用。此外,初始化将显示在自动完成中,如果它不是私有的,这会让我烦恼:)

问题

我很自豪地为框架编写了很多测试,我正在使用Xcode的内部报道(llvm cov)。不幸的是,此覆盖率报告显示init为“未涵盖”:

screenshot of init not covered by tests

这是完全合乎逻辑的,因为测试不会运行init,因为它不能 令我痛苦的是,这使我无法获得100%的良好报道。

可能的解决方案

  1. 我可以使用lcov,这样我就可以使用LCOV_EXCL_LINELCOV_EXCL_STARTLCOV_EXCL_STOP来排除来自覆盖范围的内容。
    为什么不:当Xcode中已有内置工具时,我不需要设置不同的覆盖工具。

  2. 我可以在内部访问这些内容,以便我可以通过将模块导入@testable来获取单元测试中的内容。
    为什么不:虽然它们仍然无法从框架外部访问,但它们现在在框架内可见,我不喜欢。我希望他们变得私密:D

  3. 我可以忍受我的保险从未达到100% 为什么不:因为我不能:)。

  4. 问题

    在我的单元测试中运行这个被丢弃的init,同时保持从外部和框架内部无法访问,有什么方法(我可以忍受它有点,甚至是非常hacky)?

1 个答案:

答案 0 :(得分:3)

将String常量移动到枚举,然后您将不需要私有init。

enum SpecificConstants {
    static let foo = "foo"
}