如何模拟readline.on('SIGINT')
How to mock 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);
});
}
我正在尝试测试这个函数,我的尝试,到目前为止,是:
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()
返回的对象继承自EventEmitter
,所以这就是存根将返回的对象。附加的close
函数只是添加到它中,以便在调用它时防止错误。
你不能直接返回getMsg
返回的承诺,因为这不会给你一个机会发出SIGINT
"信号"(实际上只是一个事件,但为了测试目的,它会工作得很好)。
测试应该在调用" completed "处理程序时失败,这必须显式地完成,否则Mocha认为测试通过了。
接下来,发送SIGINT
(它应该按预期触发拒绝处理程序),并返回承诺。
相关文章:
- 在VanillaJS中模拟模型双向数据绑定
- 使用jasmine模拟对服务器的调用
- 模拟谷歌地图中的点击
- 使用模拟按键在输入框中自动输入文本
- 模拟chrome.storage.local函数使用Jasmine
- 从数据库中检索字段,而不模拟它们
- react testUtils模拟点击单选按钮而不触发onchange
- 如何在ember单元测试中模拟_super()方法
- Javascript中对象的每个()的模拟值
- 模拟<按钮>在<asp:button>
- javascript上的数字类型模拟
- “createImageData()”和“new ImageData(()”有何不同
- 在Android Kitkat上模拟鼠标点击Youtube视频
- Webscratching自动化如何在没有链接TAG的情况下模拟点击HREF链接
- 用jQuery模拟点击
- 单元测试:使用酶模拟父组件中子组件的点击事件
- 在坐标上模拟点击坐标js/jQuery
- 模拟连接错误
- 布料模拟+图像上的画布变换
- 如何模拟readline.on('SIGINT')