如何使用 sinon 在一个函数中测试多个 promise

how to test muti promise in one function with sinon

这是我的函数,在这个函数中,'start'函数中有两个promise函数。我应该如何测试 'start' 函数。

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(),为每个测试设置一个沙箱并自动恢复存根。

async start 是 promise 函数,所以在你的测试中,你需要通过指定 await 来告诉 mocha,所以它会在这个函数执行完成后 运行 console.log

describe('test', function () {
  beforeEach(function() {
    sinon.stub(TTT.prototype, 'fun1').callsFake((param)=>{
        console.log('fun1');
        return (Promise.resolve('fun1'));
    });
    sinon.stub(TTT.prototype, 'fun2').callsFake((param)=>{
        console.log('fun2');
        return (Promise.resolve('fun2'));
    });
    sinon.stub(TTT.prototype, 'fun3').callsFake((param)=>{
        console.log('fun3');
        return 'fun3';
    });
  })

  afterEach(function() {
    sinon.restore(); // use single restore
  })

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

输出

test
fun1
fun2
fun3
undefined
    ✓ test


  1 passing (13ms)