Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-测试管理器对象_Javascript_Unit Testing_Tdd_Bdd - Fatal编程技术网

Javascript-测试管理器对象

Javascript-测试管理器对象,javascript,unit-testing,tdd,bdd,Javascript,Unit Testing,Tdd,Bdd,我正在开始测试世界,但仍然有一些我无法理解的疑问。我在谷歌上搜索了每一个,但找不到任何有用的东西 如果我有以下对象,它的职责是管理服务器上连接的设备,那么为它编写哪些测试是有意义的,我应该如何编写这些测试 var devicesManager = { _devices: {}, attachDevice: function(device) { _devices[device.id] = device; }, detachDevice: functi

我正在开始测试世界,但仍然有一些我无法理解的疑问。我在谷歌上搜索了每一个,但找不到任何有用的东西

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

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

  • 我希望我是清楚的

    谢谢

    据我所知,我不应该在考试中使用任何“私人”的东西

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

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

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

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

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


    如果使用真实的设备对象,则为“是”。如果使用模拟对象(编号)

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

    deviceIsAttached:function(device){
        return _devices.hasOwnProperty(device.id);
    }
    
    然后,您可以连接、测试设备是否已连接并分离


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

    感谢您提供了非常有用的答案。我只是对创建DeviceAttached并使用它测试attachDevice方法有一个疑问。当我这样做的时候,我会在一种情况下测试这两种方法吗?例如,DeviceAttached的测试与attachDevice有什么不同?非常感谢。@Thiago您将使用DevicesAttached方法来向测试方法公开状态。因为它做的事情非常简单,所以不必测试DeviceAttached方法。attachDevice/detachDevice的完整测试如下:1。创建一个新设备,比如id为4()。2.assert deviceIsAttached(设备)返回false(设备尚未连接)。3.附件设备(设备)。4.assert deviceIsAttached(设备)返回true。5.拆卸装置(装置)。6.assert DeviceAttached(设备)返回false。我没有读过任何关于白盒测试的内容。我一定会查的。关于模拟的事情,我想即使我在模拟另一个对象,我也在做集成测试。我对集成测试的理解是测试两部分之间的通信是否正确。非常感谢您的回答。我正在阅读Sinon.js文档,它说:
    mock应该只用于测试中的方法。
    。我认为这很奇怪,因为您通常会模拟与测试对象相关的对象。你怎么认为?这是url: