我从测试世界开始,仍然有一些疑点,我无法弄清楚。我搜索了每一个,但找不到任何有用的东西。
如果我有以下对象,那么它的职责是管理我服务器上的连接设备,为它编写哪些测试是有意义的,我应该如何编写这些测试?
var devicesManager = {
_devices: {},
attachDevice: function(device) {
_devices[device.id] = device;
},
detachDevice: function(device) {
delete _devices[device.id];
},
sendCommand: function(device_id, command) {
devices[device_id].performTask(command);
}
}
到目前为止,这些是我需要的对象。我的问题是:
该对象有两种方法可用于连接和分离设备。根据我的阅读,我不应该在我的测试中使用任何“私有”,所以我想我无法检查_devices对象,看看这些方法是否正在做他们应该做的事情。因为他们没有返回任何东西,我应该如何测试这些方法?或者我应该不测试它们?
sendCommand方法也是一个void返回方法。我仍然对如何测试不会改变对象状态的void方法感到困惑。如果我监视设备方法以检查是否正确调用performTask,我会进行集成测试(而不是单元)吗?
我希望我很清楚。
由于
答案 0 :(得分:0)
根据我的阅读,我不应该在我的测试中使用任何“私人”,
在我看来不正确。使用私有东西是“白盒测试”的一种形式,并且在某些情况下(例如嵌入式系统)是合法的技术。但是,您不应该修改测试代码中的任何私有内容,因为这可能会导致无意中破坏。
理想情况下,您不应该在主代码中使用任何“testMode”功能。那是因为那时你没有测试真正的代码,而是一些具有修改行为的代码。而是将要使用的对象传递给要测试的对象和函数(这种技术通常被称为“依赖注入”) - 这将允许您传递模拟对象(见下文)。
我仍然对如何测试不会改变对象状态的void方法感到困惑。
对于这些,您可以使用模拟对象。
如果我监视设备方法以检查是否正确调用performTask,我会进行集成测试(而不是单元)吗?
如果使用真实的设备对象,是的。如果你使用模拟对象,没有。
答案 1 :(得分:0)
要测试attachDevice和detachDevice方法,您可以添加另一个方法,该方法告诉您是否连接了设备。无论如何你可能会在以后需要它:
deviceIsAttached:function(device){
return _devices.hasOwnProperty(device.id);
}
然后您可以附加,测试deviceIsAttached和分离。
作为测试sendCommand方法的一个想法,您可以将命令(参数)转换为更复杂的对象,该对象知道如何测试内容(如其范围中的状态)。然后,您可以创建特殊类型的“debug”或“test”命令,这些命令在执行时会测试执行它们的对象/方法。