UnhandledPromiseRejectionWarning:

Я пытаюсь протестировать компоненты ReactJs, где у одного из них есть метод, в котором он извлекает данные, в выборке есть обещание .. Итак, я попытался создать фиктивный файл:

  const apiFetch = {
      value() {
        return 42
      },
    }

module.exports = apiFetch

тогда:

const spy = jest.spyOn(apiFetch, 'value')

const isValue = apiFetch.value()

expect(spy).toHaveBeenCalled()

expect(isValue).toBe(42)

Тест проходит успешно, но это предупреждение все еще отображается.

Я добавил еще одну вещь:

process.on('UnhandledPromiseRejectionWarning', (e) => { throw e })

UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 188)

Вопрос не содержит stackoverflow.com/help/mcve. Где это отклоненное обещание?

Estus Flask 31.07.2018 16:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
1
8 348
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

С помощью шутки вы можете сделать что-то вроде:

apiFetch.js

const apiFetch = {
    value() {
        return Promise.resolve(42);
    },
}

module.exports = apiFetch

apiFetch.test.js:

const apiFetch = require('./apiFetch');

test('the data is peanut butter', done => {
    apiFetch.value().then(data => {
        expect(data).toBe(42);
        done();
    })
});

done - это внедренный параметр функции (предоставляемый платформой jest), который при вызове указывает на конец метода тестирования.

Если вы тестируете асинхронную логику без использования асинхронных функций jest (или mocha), тогда тесты пройдут, даже если асинхронные обещания не пройдут.

редактировать

У каждого фреймворка есть обещанная поддержка. В шутку это что-то вроде

it('works with resolves', () => {
   expect.assertions(1);
   return expect(apiFetch.value()).resolves.toEqual(42);
});

При работе с чистыми обратными вызовами используйте введенный done.

При работе с обещаниями вы можете использовать внедренную функцию «done», но если обещание не выполняется и «готово» не вызывается, тест завершится ошибкой по таймауту. При тестировании логики обещаний с jest рекомендуется работать с «это», «ожидать» и «разрешить».

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

Estus Flask 31.07.2018 16:24

@estus спасибо за замечание. Ты прав. Я отредактировал ответ

Martín Zaragoza 31.07.2018 16:30

Другие вопросы по теме