Sinon事件不会触发存根/间谍

时间:2016-07-08 13:31:44

标签: javascript node.js unit-testing sinon chai

我想测试一个我用mocha,chai和sinon编写的程序。该程序背后的基本思想是打开一个serialport并定义一些由其事件触发的函数,即:

function sPort () {
   this.serialport = undefined;
   this.isConnected = false;
   this.port = undefined;

   this.connect(port, errorCallback) {
      if (this.isConnected) {
            if (errorCallback !== undefined)
                errorCallback('already connected');
            }
            return;
      }
      this.port = port;
      this.serialport = new SerialPort(this.port, {
            autoOpen: false,
            baudrate: 9600,
            dataBits: 8,
            stopBits: 1,
            parity: 'none'
        });
      this.serialport.on('open', this.handleConnect.bind(this));
      this.serialport.on('data', this.handleIncomingData.bind(this));
      this.serialport.on('error', this.handleConnectionError.bind(this));
      this.serialport.on('close', this.handleConnectionClose.bind(this)); 
      this.serialport.on('disconnect', this.handleDisconnect.bind(this));
      this.serialport.open(); 
   }
   this.disconnect() {
      this.serialport.close()
   }
   this.handleConnectionClose(){
      this.isConnected = false;
      this.serialport = undefined;
   }
}

现在我想用sinon测试这个,并检查是否,例如,关闭serialport时调用this.handleConnectionClose()。我首先尝试用

做到这一点
sPort = require('./sPort')
describe('sPort', function(){
    var conClose = sinon.spy(sPort, 'handleConnectionClosed');
    sPort.connect();
    it('should close the connection', function() {
        sPort.disconnect();
        sinon.assert.called(conClose)
        assert.isFalse(sPort.isConnected);
        expect(sPort.serialport).to.equal(undefined)
    }
}

但是所有3个断言都失败了。我认为这将是由serialport.close()的异步性引起的,并且该测试将在事件实际触发之前执行。然后我将间谍改为一个存根,它与原始函数几乎完全相同,但效果相同。我认为这可能与以前的原因相同,但我不知道我能做些什么才能得到我希望得到的结果。我将不胜感激任何帮助。

0 个答案:

没有答案