Я пытаюсь протестировать компоненты 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)





При запуске асинхронных тестов вы должны помнить, что вам нужно указать метод тестирования, когда он будет завершен.
С помощью шутки вы можете сделать что-то вроде:
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 спасибо за замечание. Ты прав. Я отредактировал ответ
Вопрос не содержит stackoverflow.com/help/mcve. Где это отклоненное обещание?