node.js - 如何使用 sinon 在一个函数中测试 muti promise
问题描述
这是我的函数,在这个函数中,'start'函数中有两个promise函数。我应该如何测试“开始”功能。
export class TTT{
fun1(){
return new Promise(((resolve, reject) => {
console.log('function1');
resolve('function1');
}))
}
fun2(param){
return new Promise(((resolve, reject) => {
console.log('function2');
resolve(param);
}))
}
fun3(param){
console.log('function3');
return param;
}
async start(){
let param1 = await this.fun1();
let param2 = await this.fun2(param1);
this.fun3(param2);
}
}
而下一个测试文件是我自己写的。我存根 fun1、fun2 和 fun3,但似乎只有第一个函数有效。
describe('test',function () {
it('test ', function () {
let stub_fun1 =
sinon.stub(TTT.prototype,'fun1').callsFake((param)=>{
console.log('fun1');
return (Promise.resolve('fun1'));
});
let stub_fun2 =
sinon.stub(TTT.prototype,'fun2').callsFake((param)=>{
console.log('fun2');
return (Promise.resolve('fun2'));
});
let stub_fun3 =
sinon.stub(TTT.prototype,'fun3').callsFake((param)=>{
console.log('fun3');
return 'fun3';
});
let handler = new TTT();
let param = handler.start();
console.log(param);
stub_fun1.restore();
stub_fun2.restore();
stub_fun3.restore();
});
});
而且,结果是
测试
乐趣1
承诺 { }
✓ 测试
功能2
功能3
解决方案
测试包含竞争条件。存根在被调用之前被恢复。
start()
承诺应该被链接:
it('test ', async function () {
...
let handler = new TTT();
let param = await handler.start();
...
});
当前设置需要restore()
手动调用。如果测试失败,则不会恢复存根。mocha-sinon
可用于省略restore()
、为每个测试设置沙箱并自动恢复存根。
推荐阅读
- sql - 将列从 varchar 更改为整数并删除非数字字符
- rxjs - 当 Angular HttpClient POST 收到 500 时,既不会调用 onNext,也不会调用 onError
- symfony - 如何同时查询 samaaccountname 和 userprincipalname symfonyLdap
- python - 似乎无法弄清楚错误:get_queryset() 采用 1 个位置参数,但给出了 2 个
- python - 使用列表时如何屏蔽?
- c# - asp.net core 2 Identity Authentication在cookie过期之前让我登录
- python-3.x - 远程登录 DUT 的 Python 代码需要进一步优化
- javascript - 是否可以实时重新渲染 d3.js 图形?
- ios - BLE设备随机断开
- php - 使用 Laravel 和 Vue.js 的 CRUD 问题