swift - 如何覆盖私有(private) init

标签 swift unit-testing code-coverage private

上下文

a framework我目前正在构建,我正在使用多个结构 (example)存储字符串常量。假设一个看起来像这样:

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

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

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

问题

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

screenshot of init not covered by tests

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

可能的解决方案

  1. 我可以使用lcov ,这将使我能够使用 LCOV_EXCL_LINELCOV_EXCL_STARTLCOV_EXCL_STOP 将 inits 从覆盖范围中排除。
    为什么不:当 Xcode 中已有内置工具时,我希望不必设置不同的覆盖工具。

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

  3. 我可以接受我的覆盖率永远不会达到 100%。
    为什么不:因为我就是做不到:)。

问题

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

最佳答案

将字符串常量移至枚举,然后就不需要私有(private)初始化。

enum SpecificConstants {
    static let foo = "foo"
}

关于swift - 如何覆盖私有(private) init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711552/

相关文章:

ios - TableView 数组映射

ios - XC测试 : Can expectationForPredicate fulfill on async variable change?

java - 类声明的 Sonar 分支覆盖

rspec - rspec 和 cucumber 的汇总cover_me 结果

Swift 和 Firebase 3.x 保存和检索数据

arrays - 如何在 Swift 中将可选数组连接到另一个数组?

ios - 播放/暂停音频按钮 Swift

unit-testing - 单元测试概率

php - Laravel 5 控制台( artisan )命令单元测试

perl - 如何设置 perl 始终运行代码覆盖率