我想测试一个我用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()的异步性引起的,并且该测试将在事件实际触发之前执行。然后我将间谍改为一个存根,它与原始函数几乎完全相同,但效果相同。我认为这可能与以前的原因相同,但我不知道我能做些什么才能得到我希望得到的结果。我将不胜感激任何帮助。