Почему Mocha возвращает undefined при тестировании функции, которая использует обещание? - PullRequest
0 голосов
/ 20 марта 2020

У меня проблема с возвратом Mocha неверного результата при тестировании функции, которая использует обещание. Не уверен, почему возвращается «неопределенное» - вызываемая функция (testFunction ()) не должна возвращаться до тех пор, пока обещание не будет выполнено.

Test:

it('test1', function() {

    let testResult = testFunction();

     assert.equal(testResult,'success');


 });

Обещание:

getPromise() {
  return new Promise((resolve, reject) => { 
          resolve('success');
      }
}

testFunction ()

testFunction = () => {

               getPromise().then(result => { return result}
      ).catch(error =>{  return error });

         }

Результат: AssertionError [ERR_ASSERTION] : undefined == 'success'

1 Ответ

0 голосов
/ 20 марта 2020

testFunction не содержит оператора возврата, поэтому он возвращает неопределенное значение. Возвращаемые значения в обратных вызовах определяют только то, что возвращают обратные вызовы, а не то, что возвращает testFunction.

Поскольку вы имеете дело с обещаниями, вам придется возвращать обещание. Вы не можете вернуть строку, потому что эта строка еще не существует. Итак, testFunction может выглядеть следующим образом:

testFunction = () => {
  return getPromise()
    .then(result => { return result })
    .catch(error => { return error });
}

Но этот .then ничего не делает, поэтому, если вы не упомянули какой-то дополнительный код, его можно удалить:

testFunction = () => {
  return getPromise()
    .catch(error => { return error; });
}

Ваш тест должен быть написан, чтобы ожидать возврата обещания. Это проще всего, если вы используете асинхронную функцию c, например:

it('test1', async function () {
  let testResult = await testFunction();
  asset.equal(testResult, 'success');
});

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

it('test1', function (done) {
  let promise = testFunction();
  promise.then(testResult => {
    assert.equal(testResult, 'success');
    done();
  });
});
...