Мокко: как отстаивать обещание отказа? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь заставить Mocha отобразить ошибку, а также подтвердить отклоненное обещание в моем коде Node - ... вместо отображения UnhandledPromiseRejectionWarning для исключения, которое приводит к отклонению моей асинхронной функции.

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

Я пытаюсь сделать это:

  • с использованием лямбда-функции

  • без использования done

  • с использованием простых утверждений (мне не нравятся expect и should)

  • обработка ошибок через try / catch (мне не нравятся цепочки .then и .catch; и мне не нравится это еще больше, если использовать .then(res,err))

Что-то вроде:

it('should give an error', 
  async ()=> {
    try{
      await generateException()
      assert(true)
    } catch(err) {
      console.err(err)
      assert ??? // how to 'assert' a promise rejection?
    }
  }
)

Если неизбежно использовать то, что мне не нравится, хорошо. Но какое решение ближе к тому, что я хотел бы?

Кроме того, я не понимаю, почему отклоненное обещание не будет поймано в try / catch, как я и ожидал, поскольку именно в этом и заключается смысл использования await (чтобы асинхронный код работал так, как если бы они были синхронно).

1 Ответ

0 голосов
/ 17 января 2019

Это работает для меня. Например, используя chai для утверждений.

const chai = require('chai');
const expect = chai.expect;

describe('test', function () {

  function generateException() {
    throw new Error('test error');
  }


  it('should give an error', async ()=> {
    try {
      await generateException();
      expect(true).to.be.false;
    } catch(err) {
      console.log(err.message);
      expect(err.message).to.equal('test error');
    }
  })
})

Кажется, есть разница в способе использования Promise.reject() против throw new Error(). Когда функция generateException выдает ошибку, ваши тесты работают. Однако, если он был Promise.reject(), он никогда не попадет в блок catch.

Если вы сделаете что-то вроде let result = await generateException();, вы увидите, что это ожидаемая ошибка, если функция geenerateException использует отклонение обещания.

Вы можете связать обещания с ожиданием, если захотите.

function generateException() {
  return new Promise(reject => {
   return reject(new Error('Promise Rejected');
})

it('should give an error', async ()=> {
  await generateException().catch(error => {
    expect(error.message).to.equal('Promise Rejected');

  })
});

Чтение частей этой статьи об асинхронном коде может немного помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...