Что означает UnhandledPromiseRejectionWarning в шутливых тестах? - PullRequest
1 голос
/ 24 мая 2019

муравей для проверки следующего модуля index.ts

async function theFunctionFail() {
  return await fail();
}

async function theFunctionSucceed() {
  return await succeed();
}

async function fail() {
  throw new Error();
}

async function succeed() {
  return "a";
}

export { theFunctionFail, theFunctionSucceed };

с использованием теста index.test.ts

import { theFunctionFail, theFunctionSucceed } from "../index";

it('theFunctionFail', () => {
  expect(theFunctionFail()).rejects;
});

Что означает UnhandledPromiseRejectionWarning в выводе

(node:10515) UnhandledPromiseRejectionWarning: Error
(node:10515) 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: 2)
(node:10515) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
 PASS  src/__tests__/index.test.ts
  ✓ theFunctionFail (6ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.806s
Ran all test suites.

относится к? Обертывание expect(theFunctionFail()).rejects в блоке try-catch(err) не исключает предупреждение, которое я считаю целесообразным исправить.

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

Я использую Typescript и Jest 24.7.1 с react-scripts.

1 Ответ

1 голос
/ 25 мая 2019

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

return expect(theFunctionFail()).rejects.toEqual(new Error());

См. Документы Jest для .rejects: https://jestjs.io/docs/en/tutorial-async#rejects

Примечание: также можно использовать try/catch, но вам нужно либо await, например:

it('theFunctionFail', async () => {
  expect.assertions(1);
  try {
    await theFunctionFail();
  } catch (err) {
    expect(err).toEqual(new Error());
  }
});

Или верните асинхронную функцию и поймайте ошибку (убедитесь, что вы вернули функцию):

it('theFunctionFail', () => {
  expect.assertions(1);
  return theFunctionFail().catch(err => {
    expect(err).toEqual(new Error());
  });
});

expect.assertions(number) - это хороший способ убедиться, что все ваши expect вызываются при тестировании асинхронного поведения.

Кроме того, если вы добавите сообщение об ошибке, например, new Error('oh no!'), вы наверняка будете знать, что уловили правильную ошибку, и ее будет легче отлаживать.

...