Javascript - 测试管理器对象

时间:2013-10-27 12:44:10

标签: javascript unit-testing tdd bdd

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

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

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,我会进行集成测试(而不是单元)吗?

  3. 我希望我很清楚。

    由于

2 个答案:

答案 0 :(得分:0)

  

根据我的阅读,我不应该在我的测试中使用任何“私人”,

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

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

  

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

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

  

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

如果使用真实的设备对象,是的。如果你使用模拟对象,没有。

答案 1 :(得分:0)

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

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

然后您可以附加,测试deviceIsAttached和分离。

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