如何模拟readline.on('SIGINT')?

我有这段代码:

function getMsg() { return new Promise(function (resolve, reject) { var input = []; var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', function (cmd) { if (cmd.trim()) { input.push(cmd); } else { rl.close(); } }); rl.on('close', function () { rl.close(); resolve(input.join('\n')); }); rl.on('SIGINT', reject); }); } 

我试图testing这个function,到目前为止,我的尝试是这样的:

 it('should reject if SIGINT is sent', function () { sandbox.stub(readline, 'createInterface', function () { return { on: function (action, callback) { callback(); }, prompt: function () {}, close: function () {} }; }); return getMsg().then(null).catch(function () { expect(true).to.be.equal(true); }); }); 

但是,当然,这不会模拟SIGINT ,我该怎么做?

我想你需要一个不同的设置:

 const EventEmitter = require('events').EventEmitter ... it('should reject if SIGINT is sent', function () { let emitter = new EventEmitter(); sandbox.stub(readline, 'createInterface', function () { emitter.close = () => {}; return emitter; }); let promise = getMsg().then(function() { throw Error('should not have resolved'); }, function (err) { expect(true).to.be.equal(true); }); emitter.emit('SIGINT'); return promise; }); 

readline.createInterface()返回的对象inheritance自EventEmitter ,所以这就是存根将返回的内容。 附加的closefunction只是简单地添加到它来防止错误时被调用。

你不能直接返回getMsg返回的promise,因为这不会给你一个发出SIGINT “signal”的机会(实际上只是一个事件,但为了testing的目的,它可以正常工作)。 所以诺言就存储了

testing应该会失败,调用“履行”的处理程序,这必须明确地完成,否则摩卡认为testing通过了。

接下来,发送SIGINT (它应该按照预期触发拒绝处理程序),然后返回promise。