如何模拟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
,所以这就是存根将返回的内容。 附加的close
function只是简单地添加到它来防止错误时被调用。
你不能直接返回getMsg
返回的promise,因为这不会给你一个发出SIGINT
“signal”的机会(实际上只是一个事件,但为了testing的目的,它可以正常工作)。 所以诺言就存储了
testing应该会失败,调用“履行”的处理程序,这必须明确地完成,否则摩卡认为testing通过了。
接下来,发送SIGINT
(它应该按照预期触发拒绝处理程序),然后返回promise。