0

我开始测试世界,但仍有一些我无法弄清楚的疑问。我用谷歌搜索了每一个,但找不到任何有用的东西。

如果我有以下对象,它的责任是管理我的服务器上的连接设备,为它编写哪些测试是有意义的,我应该如何编写这些测试?

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);
    }
}

到目前为止,这些是我需要的对象的行为。我的问题是:

  1. 该对象有两种方法仅用于附加和分离设备。从我读过的内容来看,我不应该在我的测试中使用任何“私有”的东西,所以我认为我无法检查 _devices 对象来查看这些方法是否在做它们应该做的事情。由于他们不返回任何东西,我应该如何测试这些方法?还是我根本不应该测试它们?

  2. sendCommand 方法也是一个 void 返回方法。我仍然对如何测试根本不改变对象状态的 void 方法感到困惑。如果我监视设备方法以检查 performTask 是否被正确调用,我会进行集成测试(而不是单元测试)吗?

我希望我很清楚。

谢谢

4

2 回答 2

0

要测试 attachDevice 和 detachDevice 方法,您可以添加另一个方法,它会告诉您是否连接了设备。无论如何,您以后可能需要它:

deviceIsAttached:function(device){
    return _devices.hasOwnProperty(device.id);
}

然后,您可以附加、测试是否 deviceIsAttached 并分离。

作为测试 sendCommand 方法的一个想法,您可以将命令(参数)转换为更复杂的对象,该对象知道如何测试内容(例如其范围内的状态)。然后,您可以制作特殊类型的“调试”或“测试”命令,在执行时测试执行它们的对象/方法。

于 2013-10-27T12:56:23.450 回答
0

从我读过的内容来看,我不应该在我的测试中使用任何“私人”的东西,

不正确,在我看来。使用私有的东西是“白盒测试”的一种形式,在某些情况下(例如嵌入式系统)是一种合法的技术。但是,您不应修改测试代码中的任何私有内容,因为这可能会导致意外中断。

理想情况下,您也不应该在主代码中使用任何“testMode”功能。那是因为那时您不是在测试真正的代码,而是在测试一些行为已修改的代码。而是将您想要使用的对象传递到要测试的对象和函数中(这种技术通常被称为“依赖注入”)——这将让您传入模拟对象(见下文)。

我仍然对如何测试根本不改变对象状态的 void 方法感到困惑。

对于这些,您可以使用模拟对象。

如果我监视设备方法以检查 performTask 是否被正确调用,我会进行集成测试(而不是单元测试)吗?

如果您使用真实的设备对象,是的。如果您使用模拟对象,则不会。

于 2013-10-27T12:47:42.133 回答