如何使用sinon在一个功能中测试多人承诺

时间:2018-08-23 06:56:19

标签: node.js promise sinon sinon-chai

这是我的功能,在此功能中,“开始”功能中有两个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();
});

});

然后,结果是

测试

fun1

承诺{}

✓测试

function2

function3

2 个答案:

答案 0 :(得分:0)

测试包含比赛条件。存根在被调用之前已还原。

start()承诺应被链接:

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

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

答案 1 :(得分:0)

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)