【问题标题】:How do I spy on an injected constructor?如何监视注入的构造函数?
【发布时间】:2016-12-29 17:41:08
【问题描述】:

我有一个Manager,它大量使用serialport 模块,并希望使用模拟版本的串行端口运行单元测试。我重写了我的管理器模块以利用依赖注入:

// file: manager.js

function Manager(SerialPort, device, baudRate) {
  this._device = device;
  this._serialPort = new SerialPort(device, {autoOpen: false, baudRate: baudRate })
};
Manager.prototype.constructor = Manager;

现在我想测试一下是否将正确的参数传递给new SerialPort() 调用。我被困在如何正确地存根/模拟构造函数。到目前为止,这是我所拥有的:

// file: manager-test.js

function MockSerialPort(device, options) {}

describe('Manager', function() {
  describe('constructor', function() {
    it('instantiates a serial port with correct baud rate', function() {
      const manager = new Manager(MockSerialPort, '/dev/tty', 9600);
      expect(<something>).to.be.calledWith('/dev/tty', {autoOpen: false, baudRate: 9600});
    });
  });
});

显然我有几个洞

在我的脑海里,哎呀,我的意思是

在我的代码中。我需要填写什么测试?

更新

正如@cdhowie 指出的那样,如果我可以将实例化的 SerialPort 对象传递给 Manager,生活会更轻松。由于一些误导性的文档,我认为 SerialPort API 不可能做到这一点,但在他的帮助下,现在的实现看起来像:

function Manager(serialPort) {
  this._serialPort = serialPort;
}
Manager.prototype.constructor = Manager;

这意味着在我的测试中,我只是创建了一个看起来像 SerialPort 对象一样的东西。存根和监视就变得微不足道了。

【问题讨论】:

    标签: javascript node.js mocha.js sinon chai


    【解决方案1】:

    只需使用将其参数存储在测试范围内的匿名函数即可:

    let ctorArgs;
    const manager = new Manager(function () {
        ctorArgs = Array.prototype.slice.call(arguments);
    }, '/dev/tty', 9600);
    
    // Assert against the contents of ctorArgs
    

    旁注:为什么将构造函数和参数传递给Manager,而不是只传递构造的SerialPort 对象?除非Manager 需要创建多个具有相同参数的对象,否则将创建对象的负担交给它似乎有点傻。

    【讨论】:

    • > "你为什么要传递构造函数..." 串行端口 API 没有设备的访问器,我稍后在我的管理器代码中需要它。我可以new Manager(new SerialPort(device, ...), device),但是通过设备两次闻起来很糟糕。
    • 如果你使用来自 npm 的串口,那么是的,there is an accessor
    • 哎呀——我怎么会错过呢?然后我将传入一个构造对象。容易多了,谢谢。
    • 你错过了它,因为串行端口没有完整记录,就像 npm 上 90% 的东西一样。我通常只是阅读源代码以找出可用的内容,因为很多模块缺乏任何有用或完整的文档。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多