【问题标题】:Struct property initialization testing结构属性初始化测试
【发布时间】:2022-01-04 17:06:05
【问题描述】:

XCTest 代码覆盖率表明我应该对HealthStat's id 属性初始化进行测试。最好的测试方法是什么?

struct HealthStat: Identifiable {
    let id = UUID()
    let stat: HKQuantity?
    let date: Date
}

【问题讨论】:

  • 测试覆盖率并不表示任何测试。测试覆盖率显示在测试运行期间执行了哪些代码行。您应该使用此信息来考虑是否需要进行其他测试。

标签: ios swift testing xctest


【解决方案1】:

您要测试的是什么?使用当前的实现,测试它的任何内容都相当困难,因为您无法控制 UUID 的值是什么。为了提高可测试性,您必须注入 UUID(或 UUID 本身)的创建。

例如,您可以将代码更新为...

struct HealthStat: Identifiable {
  let id: UUID
  let stat: HKQuantity?
  let date: Date

  init(id: UUID = UUID(), stat: HKQuantity?, date: Date) {
    self.id = id
    self.stat = stat
    self.date = date
  }
}

现在您可以测试您传递给模型的任何 id 是否都存储在 id 中。而且,在生产代码中,它会获得一个使用UUID() 创建的默认 UUID。

但是如何测试这种东西有无数种。

我猜这是依赖注入的最基本版本。在这种情况下,依赖项是 UUID 的创建。而且您必须注入它才能使其可测试。

搜索 Swift Dependency Injection 以详细了解它可以为您做什么。

【讨论】:

  • 是的,我也同意对结构本身的更改,以便 uuid 来自初始化程序默认值而不是属性声明。
  • 添加 init() 解决了我的问题。我只需要测试它是否正确设置了所有值。谢谢!
【解决方案2】:

您无法测试 UUID 是什么。只需测试新实例化的对象一个 UUID 并走开。做更多就意味着您正在测试 UUID 本身,这是错误的——它不是被测对象,也不属于您。

(而且通常不以/期望 100% 的覆盖率为目标。这太疯狂了。80% 是一个很好的目标。)

【讨论】:

  • 完全同意代码覆盖点。 ??
  • 感谢您的评论。我知道不会达到 100%,但是当我看到这样的代码时,我认为测试它会很快,并且它让我感兴趣如何准确地做到这一点。正如@Fogmeister 建议的那样,我通过添加一个 init() 并测试它是否正确设置了所有值来解决它。
  • 是的,这是一种很有价值的技术。
猜你喜欢
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多