2013-10-27 35 views
0

我开始测试世界,仍然有一些疑惑,我无法弄清楚。我为每一个搜索,但找不到任何有用的东西。Javascript - 测试经理对象

如果我有以下目的,那么有责任管理我服务器上的连接设备,哪些测试有意义写入以及如何编写这些测试?

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

我希望我很清楚。

感谢

回答

0

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

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

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

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

+0

谢谢你非常有帮助的答案。我对创建deviceIstact并使用它来测试attachDevice方法有一个疑问。当我这样做时,我会在一种情况下测试两种方法吗?例如,对于deviceIsAttached的测试如何与attachDevice不同?非常感谢你。 – Thiago

+0

@Thiago你会使用deviceIsAttached方法来暴露状态到测试方法。既然它做了一件非常简单的事情,你不应该测试deviceIsAttached方法。对于attachDevice/detachDevice的完整测试可能是这样的:1.创建一个新设备,让我们来说说id 4(http://xkcd.com/221/)。 2. assert deviceIsAttached(device)返回false(设备尚未连接)。 3. attachDevice(设备)。 4. assert deviceIsAttached(device)返回true。 5. detachDevice(设备)。 6.断言deviceIsAttached(device)返回false。 – pax162

0

从我读过,我不应该在我的测试中使用任何“私人”,

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

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

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

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

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

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

+0

我还没有读过关于白盒测试的任何内容。我一定会查找它。关于嘲讽的事情,我想即使我嘲笑我正在进行集成测试的其他对象。我对集成测试的理解是测试两部分之间的沟通是否正确。非常感谢你的答案。 – Thiago

+0

我正在阅读Sinon.js文档,它说下列内容:'Mocks只能用于被测方法.'。我认为这很奇怪,因为你通常会嘲笑与被测对象相关的对象。你怎么看?这是网址:[http://sinonjs.org/docs/#mocks](http://sinonjs.org/docs/#mocks) – Thiago