gpt4 book ai didi

ios - 在 Swift 中对私有(private)变量进行单元测试

转载 作者:搜寻专家 更新时间:2023-10-31 23:06:01 24 4
gpt4 key购买 nike

我很难掌握如何在所有字段都是私有(private)的类中实现单元测试。

类(class)正在使用 BLE 和 CoreLocation 计算用户的位置 - 不是那么重要。我有一个协议(protocol),当找到一个新位置时,我会调用它,所有符合该协议(protocol)的类都将收到一个房间 ID 和房间名称。那么,这意味着我类(class)中的所有字段实际上都是私有(private)的,因为是的,任何外部类(class)都没有理由访问它们吗?但这也意味着我实际上无法在该类中测试任何内容,即使有相当多的功能我想测试。我的意思是,我可以将变量设置为内部变量而不是私有(private)变量,但仅仅为了单元测试而这样做似乎是错误的。我听说过依赖注入(inject),但它看起来太费力了。

例如我有这个功能:


private var beacons: [AppBeacon] = []
private var serverBeacons:[Beacon] = []

private func addBeacons(serverBeacons: [Beacon]){
for beacon in serverBeacons {
let beacon = AppBeacon(id: beacon.id, uuid: beacon.uuid, building: beacon.building, name: beacon.name)
beacons.append(beacon)
}
}

例如,我无法测试信标数组是否真的按照我的意愿填满了。我类(class)的公共(public)功能基本上是一个名为 startLocating 的函数,结果是房间 ID 和名称,我知道在黑盒测试中模仿哪个单元测试(对吗?)我不应该关心中间步骤,但老实说,这么多功能我应该说,没关系?并假设我确实用我选择的一些 rssi 值填充了信标,实际的定位算法是在 node.js 服务器上执行的,所以老实说我不知道​​要测试客户端什么?

这是经典的 MVC,在截止日期之前我无法更改它的架构,所以我不知道从这里开始的最佳方式是什么?只是不测试功能?将字段设置为内部字段而不是私有(private)字段?我们在服务器端对算法本身进行测试,因此已经测试了房间 ID 是否为预期房间 ID。

我在另一篇文章中读到以下内容:

“根据定义,单元测试是黑盒测试,这意味着您不关心测试单元的内部结构。您主要感兴趣的是根据您提供的输入查看单元输出是什么单元测试。现在,通过输出我们可以断言几件事:

  • 方法的结果
  • 对象作用后的状态,
  • 与对象所具有的依赖项的交互

在所有情况下,我们只对公共(public)接口(interface)感兴趣,因为这是与世界其他地方通信的接口(interface)。私有(private)元素不需要进行单元测试,因为任何私有(private)元素都会被公共(public)元素间接使用。诀窍是编写足够多的测试来锻炼公共(public)成员,以便完全覆盖私有(private)成员。

另外,要记住的一件重要事情是单元测试应该验证单元规范,而不是它的实现。验证实现细节增加了单元测试代码和被测试代码之间的紧密耦合,这有一个很大的缺点:如果被测试的实现细节发生变化,那么很可能单元测试也需要改变,这会降低好处对该段代码进行单元测试。”

从中我基本上理解为我不应该对此进行单元测试?

最佳答案

如果您有一个private var 可以帮助您编写单元测试,请将其更改为private(set) var 以便可以读取(但不能更改) .

揭示内部结构可能会困扰您。如果是,则可能有另一种类型等待从 View Controller 中提取。

关于ios - 在 Swift 中对私有(private)变量进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com