Как проверить мути обещание в одной функции с sinon

Вот моя функция, в этой функции есть две функции обещания в функции '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();
});

});

И, результат

тестовое задание

fun1

Обещание {}

✓ тест

function2

function3

2 ответа

Решение

Тест содержит условия гонки. Заглушки восстанавливаются до того, как их вызывают.

start() обещание должно быть приковано:

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

Текущая настройка требует restore() вызываться вручную. Заглушки не будут восстановлены в случае сбоя теста. mocha-sinon может использоваться, чтобы опустить restore(), установите песочницу для каждого теста и восстановите заглушки автоматически.

async start это функция обещания, так что в вашем тесте, вы должны сказать мокко, указав await так будет бегать 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)
Другие вопросы по тегам