首页 > 解决方案 > 如何使用 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

标签: node.jspromisesinonsinon-chai

解决方案


测试包含竞争条件。存根在被调用之前被恢复。

start()承诺应该被链接:

it('test ', async function () {
    ...
    let handler = new TTT();
    let param = await handler.start();
    ...
});

当前设置需要restore()手动调用。如果测试失败,则不会恢复存根。mocha-sinon可用于省略restore()、为每个测试设置沙箱并自动恢复存根。


推荐阅读