我很难理解如何在所有字段都是私有的类中实现单元测试,该类正在使用BLE和CoreLocation计算用户的位置 - 这并不重要。我有一个协议,当找到新位置时,我会调用它,符合该协议的所有类将接收一个房间ID和房间名称。因此,这意味着我的类中所有字段都是私有的,因为没有任何外部类应该访问它们,对吧?但是这也意味着我无法测试该类中的任何内容,尽管有一些函数我想测试。我的意思是,我可以将变量从private更改为internal,但这似乎只是为了进行单元测试而做的事情,所以并不正确。我听说过依赖注入,但它似乎需要很多努力。
例如,我有这个函数:
例如,我无法测试是否按照我想要的方式填充了信标数组。我的类的公共特性基本上是一个名为startLocating的函数和结果,即房间ID和名称。在黑盒测试中(正确吗?),我应该不关心中间步骤,但是说实话,有这么多的功能,我应该说“不重要”吗?假设我用我选择的rssi值填充了信标,则实际位置算法在node.js服务器上执行,因此我真的不知道客户端应该测试什么?这是经典的MVC,直到我拥有的最后期限,我无法更改它的架构,所以我不知道从哪里入手?只是不测试功能?将字段设置为内部而不是私有?我们会对算法本身进行服务器端的测试,因此已经测试了房间ID是否为预期房间ID。
我在另一篇帖子上读到以下内容: "单元测试的定义是黑盒测试,这意味着您不关心测试单元的内部。您主要是想看看根据单元测试中提供的输入,单元输出了什么。 现在,通过输出,我们可以断定几件事情:" - 方法的结果 - 操作后对象的状态, - 对象具有的依赖项的交互
"在所有情况下,我们只关心公共接口,因为那是与世界其他部分通信的接口。私有内容不需要进行单元测试,因为任何私有项目都是由公共项目间接使用的。关键是编写足够的测试来运行公共成员,以便完全覆盖私有成员。 此外,要记住的一件重要事情是,单元测试应验证单元规格,而不是实现。验证实现细节会在单元测试代码和测试代码之间产生紧密耦合,这具有很大的缺点:如果测试实现细节发生更改,则可能需要更改单元测试,这降低了为该代码单元编写单元测试的好处。"
从这个描述中,我理解为我应该不进行单元测试?
例如,我有这个函数:
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)
}
}
例如,我无法测试是否按照我想要的方式填充了信标数组。我的类的公共特性基本上是一个名为startLocating的函数和结果,即房间ID和名称。在黑盒测试中(正确吗?),我应该不关心中间步骤,但是说实话,有这么多的功能,我应该说“不重要”吗?假设我用我选择的rssi值填充了信标,则实际位置算法在node.js服务器上执行,因此我真的不知道客户端应该测试什么?这是经典的MVC,直到我拥有的最后期限,我无法更改它的架构,所以我不知道从哪里入手?只是不测试功能?将字段设置为内部而不是私有?我们会对算法本身进行服务器端的测试,因此已经测试了房间ID是否为预期房间ID。
我在另一篇帖子上读到以下内容: "单元测试的定义是黑盒测试,这意味着您不关心测试单元的内部。您主要是想看看根据单元测试中提供的输入,单元输出了什么。 现在,通过输出,我们可以断定几件事情:" - 方法的结果 - 操作后对象的状态, - 对象具有的依赖项的交互
"在所有情况下,我们只关心公共接口,因为那是与世界其他部分通信的接口。私有内容不需要进行单元测试,因为任何私有项目都是由公共项目间接使用的。关键是编写足够的测试来运行公共成员,以便完全覆盖私有成员。 此外,要记住的一件重要事情是,单元测试应验证单元规格,而不是实现。验证实现细节会在单元测试代码和测试代码之间产生紧密耦合,这具有很大的缺点:如果测试实现细节发生更改,则可能需要更改单元测试,这降低了为该代码单元编写单元测试的好处。"
从这个描述中,我理解为我应该不进行单元测试?
beacons
属性,您可以测试一个使用该属性的函数,并在调用要测试的函数之前通过调用addBeacons
来设置它。 - Joakim DanielsonaddBeacons();
XCTAssertEqual(beacons.first.id, "id")
因为beacons是私有的,所以我根本无法访问该属性。 - Christian Hjelmslundbeacons
读取数据时,因为beacons
是私有的?甚至addBeacons
也是私有的?在我的测试套件中,我甚至不能调用addBeacons
。我能调用的是startLocating()
,它确实调用另一个函数,然后调用addBeacons()
,但该类中所有函数的结果本质上都是房间名称和房间ID,并没有验证addBeacons()
是否正常工作。我不知道我是不是太蠢了,但你能否再详细解释一下呢? - Christian HjelmslundaddBeacons
也是私有的,但是我关于编写公共API测试的说法仍然成立。 - Joakim Danielson