Модульное тестирование NodeJS Promise внутри функции

1

Я пытаюсь выполнить тестирование функции, которая называет обещание...

Использование Мокки, Синон. У меня есть функциональный блок:

myfile.js:

    let OuterDependecy = require('mydep');
    function TestFunction(callback) {
        OuterDependency.PromiseFunction().then(response => {  

       //some logic here
     }).catch(err => {callback(err)});

внутри моего теста я использовал proxyquire, чтобы высмеять внешнюю зависимость

testfile.js

let proxyquire = require('proxyquire');
let OuterDepStub = {};
let testingFunc = proxyquire('myfile.js', {'mydep': OuterDepStub});

... затем внутри моего блока тестирования

    let stubCallback = function() {
                console.log('Stub dubadub dub'); //note...i can use sinon.spy here instead
    };

   beforeEach(()=>{
            OuterDependency.PromiseFunction = function(arg) {
               return  new Promise((resolve, reject)=>{
                   reject('BAD');
               });
            };


            spy = sinon.spy(stubCallback);
       });

мой фактический тест теперь вызывает основную "тестовую функцию",

it('Catches Errors, and calls back using error', done => {
            TestFunction(stubCallback);
            expect(spy).to.have.been.called;
            done();
        });

Я вижу, что заглушка называется (журнал консоли, поэтому почему я не хотел использовать sinon.spy), но шпион говорит, что его не вызывали. и единичный тест не удался.

Я полагаю, что это, вероятно, связано с состоянием гонки, где обещание разрешается после того, как мой тест запущен... есть все равно, чтобы отложить тест, пока мое обещание не будет разрешено.

я знаю, что в тестировании обещаний angularjs существует способ "пометить" обещание, поэтому он решает, когда захочешь. возможно в nodejs?

Теги:
unit-testing
mocha

1 ответ

1
Лучший ответ
  • есть все равно, чтобы отсрочить тест, пока мое обещание не решится.

Насколько я понимаю вашу проблему, да, вы должны только позвонить done() после того, как обещание будет разрешено. Для этого вам нужны две вещи:

1- TestFunction чтобы вернуть Promise, так что вы можете подождать, пока он не решает:

    function TestFunction(callback) {
     return OuterDependency.PromiseFunction().then(response => {

        //some logic here
    }).catch(err => { callback(err) });
}

2- Подождите, это обещание решить, а затем вызвать done.

it('Catches Errors, and calls back using error', done => {
    TestFunction(stubCallback).then(() => {
        expect(spy).to.have.been.called;
        done();
    })
});

Теперь, наш then блок не будет работать до catch блока в TestFunction, поэтому если тест работает, как ожидался (т.е. блока пожаров уловов и обратный вызов увольняет), математическое ожидание и сделали звонки всегда будут срабатывать после обратного вызова вызывается,

  • Я вижу, что заглушка называется (журнал консоли, поэтому почему я не хотел использовать sinon.spy), но шпион говорит, что его не вызывали. и единичный тест не удался.

Это потому, что ваше ожидание выполняется сразу после TestFunction, не дожидаясь его TestFunction. Тем не менее, он будет вызван в последнее время, поэтому console.log появится в следующей спецификации.

  • 0
    это не сработало, к сожалению.
  • 0
    так плохо! кто-то изменился, когда вы пытались? Понравился порядок операторов console.log ? Вы уверены, что TestFunction действительно не работает?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню