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

标签 ios swift unit-testing private

我很难掌握如何在所有字段都是私有(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/

相关文章:

ios - 在动态 UITableView 原型(prototype)中访问行高

objective-c - AssetURL 是否保证在设备上是唯一的?

ios - CSS |网格自动列 : min-content | not working in IOS 10. 3.3

ruby-on-rails - 运行单轨单元/功能测试

iOS 单元测试 : how to handle completion of tests?

python - 如何创建带有内置 "test/main.py"main 函数的 python 包?

php - PHP 加密与 iOS 和 .NET 的区别

swift - 未检测到 SpriteKit 碰撞

macos - 无法使用 '==' 类型的参数列表调用 '(UInt16, UInt16)' 吗?

iOS Twin Push SDK Lib showNotification 未触发